Странный тайм-аут на 4-м HttpWebRequest в многопоточном приложении

У меня есть многопоточное консольное приложение, работающее как сервер. Сервер порождает новый поток каждый раз, когда новый клиент подключается к TcpListener:

//code copied from http://www.switchonthecode.com/tutorials/csharp-tutorial-simple-  threaded-tcp-server
//blocks until a client has connected to the server
TcpClient client = tcpListener.AcceptTcpClient();  
//create a thread to handle communication with connected client
Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
                clientThread.Start(client);

Поток делает ряд HttpWebRequests, используя следующий код:

public static HttpWebResponse HttpGet(string pRequestURI, string pArgs)
{
    string requestURI = string.Format("{0}?{1}", pRequestURI, pArgs);
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestURI);
    request.Method = "GET";
    request.ContentType = "application/x-www-form-urlencoded";
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    return response;
}

Проблема в том, что я получаю тайм-аут на ЧЕТВЕРТЫЙ ЗАПРОС. Это действительно странно, и я не могу понять это. Код отлично работал, когда он был в однопоточном приложении. Я также обязательно закрою поток ответов, используя:

response.Close();

RequestURI правильный, потому что я пытался скопировать и вставить его в свой браузер. На самом деле, неважно, какой 4-й запрос (пробовал с разными), всегда получаю тайм-аут.

Я предполагаю, что это может быть связано с ограничениями потоков, но я действительно не знаю, как это решить. Любые предложения будут ценны.

Спасибо.


person Rachel    schedule 30.12.2011    source источник
comment
Просто для уточнения: у вас есть только один клиент, и это четвертый запрос сервера, который терпит неудачу? Или проблема проявляется только с более чем одним клиентом?   -  person arx    schedule 31.12.2011
comment
@arx На данный момент у меня есть только один клиент, веб-приложение ASP.NET. Со временем у сервера будет больше клиентов, но на данный момент у меня только один.   -  person Rachel    schedule 31.12.2011
comment
Это не очень похоже на проблему с потоками. У вас есть только два: основной поток, который простаивает в ожидании другого соединения, и служебный поток, у которого нет другого потока, которому можно было бы помешать. Вы делаете что-нибудь между выполнением веб-запросов? Вы закрываете ответ перед отправкой следующего запроса или оставляете их все открытыми, чтобы вы могли обработать их вместе?   -  person arx    schedule 31.12.2011
comment
@arx На самом деле у меня есть 3 потока, потому что это не основной поток, который прослушивает запросы, а другой поток прослушивателя, созданный из него. Я закрываю ответ, прежде чем сделать другой запрос. На самом деле я немедленно обрабатываю ответ, а затем закрываю его.   -  person Rachel    schedule 31.12.2011
comment
Основной поток что-нибудь делает?   -  person arx    schedule 31.12.2011
comment
@arx На данный момент нет. Он просто охватывает поток слушателя. Но в будущем он породит другой поток, который будет выполнять другую обработку. (Еще не дошли руки до написания кода.)   -  person Rachel    schedule 31.12.2011
comment
Так что это все еще не похоже на проблему с потоками. Что бы я сделал, так это снова запустил однопоточную версию (чтобы убедиться, что на другом сервере ничего не изменилось), а затем сделал разницу между однопоточной и многопоточной версиями, чтобы убедиться, что я случайно не изменил ничего, кроме потоков.   -  person arx    schedule 31.12.2011
comment
@arx Я пытался сделать сервер (консольное приложение) однопоточным, но это ВСЕ ЕЩЕ не удалось, так что это определенно не проблема с потоками. Я повторно скопировал тот же код обратно в веб-приложение (ASP.NET) и, таким образом, полностью исключил использование сокетов, и код снова работает. Так было изначально. Я сбит с толку тем, что может быть проблемой с консольным приложением.   -  person Rachel    schedule 31.12.2011


Ответы (2)


После большой крови, пота и слез мне удалось ее решить.

На самом деле это была глупая ошибка, оказывается, было одно место, где я не закрывал запрос.

По какой-то (неизвестной) причине это не влияет на запросы, сделанные из веб-приложения, но при отправке запросов из консольного приложения возникают проблемы с тайм-аутом.

Спасибо @arx за вашу помощь - очень признателен.

person Rachel    schedule 31.12.2011
comment
Для меня мне пришлось закрыть всю группу соединений, используя request.ServicePoint.CloseConnectionGroup(request.ConnectionGroupName); для каждого запроса, который я сделал, после получения ответа. - person SimpleVar; 19.03.2013

request.ServicePoint.CloseConnectionGroup(request.ConnectionGroupName); Эта строка кода решила мою проблему. Спасибо.

person Shashi3456643    schedule 16.10.2014