我有一个抽象类,它在构造函数中生成一个无限循环的线程。在完成类的使用时,确保该线程被中止的最佳方法是什么?
我应该实现IDisposable,只需使用它吗?
public void Dispose()
{
this.myThread.Abort();
}
我读到Abort()是邪恶的。我是否应该让Dispose()设置一个私有bool标志,线程检查为true以退出其循环?
public void Dispose()
{
this.abort = true;
}
//在线程的循环中......
if (this.abort)
{
break;
}
请改用BackgroundWorker类吗?
答案 0 :(得分:4)
我想扩展“lc”提供的答案(其他方面很棒)。
要使用他的方法,您还需要将布尔标记标记为“volatile”。这将引入一个“内存屏障”,它将确保每次后台线程读取它将从内存中获取的变量(而不是寄存器),并且当变量被写入时,数据在CPU缓存之间传输
答案 1 :(得分:3)
使用布尔标志而不是无限循环,可以将主类设置为循环条件。完成后,设置标志,以便循环可以正常退出。如果实现IDisposable
,请设置标志并等待线程在返回之前终止。
你可以实现一个可取消的BackgroundWorker
类,但基本上它会完成同样的事情。
如果你真的想要,你可以在发送信号后给它一个完成时间的窗口。如果它没有终止,你可以像Windows在关机时那样中止线程。
我认为Thread.Abort
被认为是“邪恶”的原因是它使事物处于未定义的状态。然而,与杀死整个进程不同,剩余的线程继续运行并可能遇到问题。
答案 2 :(得分:0)
我建议使用BackgroundWorker方法。它的实施和清理相对简单。