闭包捕获的变量如何与不同的线程交互?在下面的示例代码中,我想将totalEvents声明为volatile,但是C#不允许这样做。

(是的,我知道这是错误的代码,这只是一个示例)

private void WaitFor10Events()
{
     volatile int totalEvents = 0; // error CS0106:

     _someEventGenerator.SomeEvent += (s, e) => totalEvents++;

     while(totalEvents < 10)
        Thread.Sleep(100);
}

编辑:人们似乎有点遗漏了我的问题。我知道我不能在本地var上使用volatile。我也知道示例代码是错误的,可以用其他方式实现,因此我的“错误代码”免责声明。只是为了说明问题。

无论如何,似乎没有办法将 Volatile 语义强加到捕获的局部变量上,因此我将实现另一种方式。不过,感谢您的回答,我还是学到了一些有用的东西。 :)

最佳答案

易挥发

private void WaitFor10Events()
{
     int totalEvents = 0;

     _someEventGenerator.SomeEvent += (s, e) => Volatile.Write(ref totalEvents, totalEvents+1);

     while(totalEvents < 10)
        Thread.Sleep(100);
}

也就是说,在这种情况下,我仍然会使用Interlocked.Increment

关于c# - 使闭包捕获的变量易变,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9413080/

10-12 06:45