闭包捕获的变量如何与不同的线程交互?在下面的示例代码中,我想将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/