C#:正确释放线程

时间:2009-05-07 23:43:32

标签: c# multithreading

我有一个抽象类,它在构造函数中生成一个无限循环的线程。在完成类的使用时,确保该线程被中止的最佳方法是什么?

我应该实现IDisposable,只需使用它吗?

public void Dispose()
{
    this.myThread.Abort();
}

我读到Abort()是邪恶的。我是否应该让Dispose()设置一个私有bool标志,线程检查为true以退出其循环?

public void Dispose()
{
    this.abort = true;
}

//在线程的循环中......

if (this.abort)
{
    break;
}

请改用BackgroundWorker类吗?

3 个答案:

答案 0 :(得分:4)

我想扩展“lc”提供的答案(其他方面很棒)。

要使用他的方法,您还需要将布尔标记标记为“volatile”。这将引入一个“内存屏障”,它将确保每次后台线程读取它将从内存中获取的变量(而不是寄存器),并且当变量被写入时,数据在CPU缓存之间传输

答案 1 :(得分:3)

使用布尔标志而不是无限循环,可以将主类设置为循环条件。完成后,设置标志,以便循环可以正常退出。如果实现IDisposable,请设置标志并等待线程在返回之前终止。

你可以实现一个可取消的BackgroundWorker类,但基本上它会完成同样的事情。

如果你真的想要,你可以在发送信号后给它一个完成时间的窗口。如果它没有终止,你可以像Windows在关机时那样中止线程。

我认为Thread.Abort被认为是“邪恶”的原因是它使事物处于未定义的状态。然而,与杀死整个进程不同,剩余的线程继续运行并可能遇到问题。

答案 2 :(得分:0)

我建议使用BackgroundWorker方法。它的实施和清理相对简单。