线程安全的网络流冻结了调用它的Close()方法的线程

时间:2011-01-10 08:09:00

标签: c# multithreading stream

来自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 :(得分:0)

建议从TCP/View之类的东西开始查找底层流的状态 - 另一端是不允许它干净地清理?或者您是否需要设置套接字选项以更快地关闭?

解决方法可能是允许Close在线程池中发生,或允许GC将未关闭的流放入终结队列。

答案 1 :(得分:0)

如果没有其他帮助,请尝试在request.Abort()之前致电stream.Close()