我在工作线程中有一个对象,可以指示其停止运行。我可以使用bool或AutoResetEvent来实现此目的:

bool 值:

private volatile bool _isRunning;

public void Run() {
    while (_isRunning)
    {
        doWork();
        Thread.Sleep(1000);
    }
}

AutoResetEvent:
private AutoResetEvent _stop;

public void Run() {
    do {
        doWork();
    } while (!_stop.WaitOne(1000));
}

然后,Stop()方法将_isRunning设置为false,或调用_stop.Set()

除此之外,使用AutoResetEvent的解决方案可能会停止得更快一些,这些方法之间有什么区别吗?这个比那个好吗?

最佳答案

C#volatile不能提供所有保证。它可能仍会读取过时的数据。最好使用底层OS同步机制,因为它提供了更强大的保证。

所有这些都是Eric Lippert所著的discussed深度文章(非常值得一读),这里是简短的报价:

关于c# - AutoResetEvent与 bool 值以停止线程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11953234/

10-11 02:18