我可以从第二个线程安全地关闭System.IO.Stream(或任何包装器或读取器)吗?
我从网络上读了new System.IO.StreamReader(inputStream, Encoding.ASCII);
,我正在考虑通过关闭它来关闭它。
如果这不是一个好主意,那么在读取调用中强制阻塞线程的另一种方法是什么呢?
答案 0 :(得分:2)
从单独的线程盲目地调用Close方法是不安全的。 Stream类未被列为线程安全,并且在原始线程正在使用它时,从另一个线程调用Close 将导致未定义的行为。
答案 1 :(得分:1)
是的,如果inputStream正在从套接字读取,那么您可以在另一个将关闭套接字连接的线程上进行处理。您应该知道阻塞的Read调用将引发异常。
答案 2 :(得分:1)
在这种情况下整理清理的常用方法是:
IsDone = true
)IsDone
是否为真。如果IsDone
为真,则忽略该数据,然后关闭该流。这应该避免Jared引用的任何问题。
答案 3 :(得分:0)
是的,可以在另一个线程上关闭一个流,但要注意这样做的后果。如果你这样做,另一个线程正在使用该流,你将得到一个例外。正确的做法是拥有一个事件或一个等待句柄,执行读取的线程可以检查它是否应该关闭。伪代码看起来像这样: 线程1。 执行读操作并查看是否有要读取的数据 如果是数据,请阅读一些数据。如果没有,继续 检查等待句柄。如果已设置,请将其关闭并终止,否则请阅读更多内容 环
线程2。 如果我应该触发网络断开连接,请发信号等待句柄做其他事情。
请注意,如果您正在执行阻止操作,则会出现异常。我建议永远不要使用阻塞套接字,没有理由。我们实际上(几乎)在System.Net的引擎下执行所有操作异步,并且同步代码路径只触发异步代码路径,然后阻塞直到它们完成。