Gaz*_*yer 13 c# closures volatile
闭包捕获的变量如何与不同的线程交互?在下面的示例代码中,我想将totalEvents声明为volatile,但C#不允许这样做.
(是的我知道这是不好的代码,这只是一个例子)
private void WaitFor10Events()
{
volatile int totalEvents = 0; // error CS0106:
_someEventGenerator.SomeEvent += (s, e) => totalEvents++;
while(totalEvents < 10)
Thread.Sleep(100);
}
Run Code Online (Sandbox Code Playgroud)
编辑:人们似乎忽略了我的问题.我知道我不能volatile在当地的变种上使用.我也知道示例代码很糟糕,可能以其他方式实现,因此我的"坏代码"免责声明.这只是为了说明问题.
无论如何,似乎没有办法强制将volatile语义强加到捕获的局部变量上,所以我将实现一种不同的方式.谢谢你的回答,无论如何我已经学到了很多有用的东西.:)
易失性。写来救援:
private void WaitFor10Events()
{
int totalEvents = 0;
_someEventGenerator.SomeEvent += (s, e) => Volatile.Write(ref totalEvents, totalEvents+1);
while(totalEvents < 10)
Thread.Sleep(100);
}
Run Code Online (Sandbox Code Playgroud)
也就是说,我仍然会Interlocked.Increment在这种特殊情况下使用..