16

如果线程正在运行通过退出 using 块而释放的对象中的方法,会发生什么情况?
例子:

    使用 (SomeObject obj = new SomeObject ())
    {
      obj.param = 10 ;
      线程 newThread = new Thread(() => { obj.Work(); });
      newThread.Start();
    }
    ...
 

obj.Work () 在一个新线程上运行,但obj是一个 IDisposable 对象,通常会在 using 块退出时被释放。如果在 using 块结束后线程继续运行会发生什么?只有在线程完成后才会释放对象吗?还是会断线?

谢谢。

4

4 回答 4

11

有趣的事情会发生。

具体来说,将在调用 Work 之前或之后调用 SomeObject 上的 dispose 方法,因为它可能会或可能不会被安排在该点运行。

之后,就看 SomeObject 的 dispose 方法做什么了;例如,如果它释放了一个未在“工作”中使用的 SqlConnection,那么应该没有问题;但是,如果 SomeObject 期望它没有被释放,那么您可能会在该线程中抛出异常。

于 2009-06-23T14:05:02.597 回答
4

请记住,这IDisposable只是一种模式,不会释放与对象关联的内存。在这种情况下,using块的关闭将调用obj.Dispose并且正在使用的其他线程obj将继续运行。

这会给您带来奇怪的问题,因为obj's状态可能会在其他线程使用它时发生变化(这完全取决于Dispose方法的实现方式)。不用说IDisposable,线程和using语句的这种应用充其量是有问题的。

于 2009-06-23T14:04:50.790 回答
2

该对象将在块的末尾调用 Dispose。它将继续运行,但 obj 将变得不稳定,因为 Dispose 假设关闭连接等。现在可能会设置 obj 以检查是否正在使用某些东西并在之后关闭它,但我不会指望这一点,除非你已经编写了对象来处理这个问题。

于 2009-06-23T14:05:08.183 回答
1

当 using 块在主线程上退出时,它将 .Dispose() 对象,这可能会导致各种有趣的并发问题。但是,对象不会被垃圾回收——它会保留,但处于无效状态,具体取决于您对 .Dispose() 的实现。

于 2009-06-23T14:05:00.257 回答