Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:正确释放螺纹_C#_Multithreading - Fatal编程技术网

C#:正确释放螺纹

C#:正确释放螺纹,c#,multithreading,C#,Multithreading,我有一个抽象类,它在构造函数中生成一个无限循环线程。当类使用完毕时,确保该线程中止的最佳方法是什么 我应该实现IDisposable并简单地使用它吗 public void Dispose() { this.myThread.Abort(); } 我读到Abort()是邪恶的。我是否应该让Dispose()设置一个私有bool标志,线程检查该标志是否为true以退出其循环 public void Dispose() { this.abort = true; } //在线程的循

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

我应该实现IDisposable并简单地使用它吗

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。