我可以从另一个线程调用stream.Close吗?

时间:2009-08-25 21:08:56

标签: c# .net

我可以从第二个线程安全地关闭System.IO.Stream(或任何包装器或读取器)吗?

我从网络上读了new System.IO.StreamReader(inputStream, Encoding.ASCII);,我正在考虑通过关闭它来关闭它。

如果这不是一个好主意,那么在读取调用中强制阻塞线程的另一种方法是什么呢?

4 个答案:

答案 0 :(得分:2)

从单独的线程盲目地调用Close方法是不安全的。 Stream类未被列为线程安全,并且在原始线程正在使用它时,从另一个线程调用Close 将导致未定义的行为。

答案 1 :(得分:1)

是的,如果inputStream正在从套接字读取,那么您可以在另一个将关闭套接字连接的线程上进行处理。您应该知道阻塞的Read调用将引发异常。

答案 2 :(得分:1)

在这种情况下整理清理的常用方法是:

  1. 设置一个表示完成的值(例如IsDone = true
  2. 将一些数据写入套接字,以便阻塞读取获取一些数据
  3. 在从套接字读取的线程上,在处理读取数据之前检查IsDone是否为真。如果IsDone为真,则忽略该数据,然后关闭该流。
  4. 这应该避免Jared引用的任何问题。

答案 3 :(得分:0)

是的,可以在另一个线程上关闭一个流,但要注意这样做的后果。如果你这样做,另一个线程正在使用该流,你将得到一个例外。正确的做法是拥有一个事件或一个等待句柄,执行读取的线程可以检查它是否应该关闭。伪代码看起来像这样: 线程1。 执行读操作并查看是否有要读取的数据 如果是数据,请阅读一些数据。如果没有,继续 检查等待句柄。如果已设置,请将其关闭并终止,否则请阅读更多内容 环

线程2。 如果我应该触发网络断开连接,请发信号等待句柄做其他事情。

请注意,如果您正在执行阻止操作,则会出现异常。我建议永远不要使用阻塞套接字,没有理由。我们实际上(几乎)在System.Net的引擎下执行所有操作异步,并且同步代码路径只触发异步代码路径,然后阻塞直到它们完成。