C#:正确释放螺纹
我有一个抽象类,它在构造函数中生成一个无限循环线程。当类使用完毕时,确保该线程中止的最佳方法是什么 我应该实现IDisposable并简单地使用它吗C#:正确释放螺纹,c#,multithreading,C#,Multithreading,我有一个抽象类,它在构造函数中生成一个无限循环线程。当类使用完毕时,确保该线程中止的最佳方法是什么 我应该实现IDisposable并简单地使用它吗 public void Dispose() { this.myThread.Abort(); } 我读到Abort()是邪恶的。我是否应该让Dispose()设置一个私有bool标志,线程检查该标志是否为true以退出其循环 public void Dispose() { this.abort = true; } //在线程的循
public void Dispose()
{
this.myThread.Abort();
}
我读到Abort()是邪恶的。我是否应该让Dispose()设置一个私有bool标志,线程检查该标志是否为true以退出其循环
public void Dispose()
{
this.abort = true;
}
//在线程的循环中
if (this.abort)
{
break;
}
改用BackgroundWorker类?改用可由主类设置为循环条件的布尔标志,而不是无限循环。完成后,设置标志,使循环可以正常退出。如果实现了
IDisposable
,请设置标志并等待线程终止后再返回
您可以实现一个可取消的BackgroundWorker
类,但本质上它将完成相同的任务
如果你真的愿意,你可以给它一个时间窗口,让它在发出信号后自己完成。如果它没有终止,您可以像Windows关闭时那样中止线程
我认为
Thread.Abort
被认为是“邪恶”的原因是它使事物处于未定义的状态。但是,与杀死整个进程不同的是,剩余的线程会继续运行并可能遇到问题。我建议使用BackgroundWorker方法。它的实现和清理都相对简单。我想进一步介绍一下“lc”提供的答案(它在其他方面很好)
要使用他的方法,还需要将布尔标志标记为“volatile”。这将引入一个“内存屏障”,它将确保每次后台线程读取变量时,它都会从内存(而不是寄存器)中抓取变量,并且当变量写入时,数据会在CPU缓存之间传输。C#不需要任何类型的内存屏障来设置这样的标志吗?它需要。您需要使用“volatile”关键字。在实践中,即使没有volatile(至少在x86和x64上),您最终也会看到标志值——这可能需要一些时间(几毫秒),但您会看到它。尽管理论上斯科特是对的,这里实际上应该使用volatile。