Потокобезопасный сетевой поток замораживает поток, который вызывает его метод Close () - PullRequest
0 голосов
/ 10 января 2011

Потокобезопасный поток из WebResponse.GetResponseStream() передается другому потоку, который будет читать stream до конца и Close() его.stream.synchronized() используется для обеспечения безопасности потока потока:

// Thread A
HttpWebResponse response = request.GetResponse(); 
return Stream.Synchronized(response.GetResponseStream());

// Thread B
// Read the stream to the end
stream.Close(); // Here thread doesn't get back

Тема B находится под контролем другой темы, которая не является предметом этого вопроса (тема C).Единственное, что относится к потоку C, это то, что если поток B не выйдет должным образом, он будет Abort() потоком B. Проблема в том, что поток B зависает на stream.Close() и он всегда прерывается потоком C. Независимо от времени ожидания (используется ручка ожидания с тайм-аутом)) Я установил, поток B не пройдет эту линию, и в течение тайм-аута CPU составляет 100%

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 14 января 2011

Попробуйте позвонить request.Abort() до stream.Close(), если вам больше ничего не поможет.

0 голосов
/ 10 января 2011

Предложите начать с чего-то вроде TCP / View , чтобы найти состояние базового потока - не позволяет ли другой конец очистить его чисто?Или вам нужно настроить параметры сокета для более быстрого закрытия?

Обходной путь может заключаться в том, чтобы позволить Close произойти в пуле потоков, или позволить GC поместить незакрытый поток в очередь завершения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...