使闭包捕获的变量变为volatile

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语义强加到捕获的局部变量上,所以我将实现一种不同的方式.谢谢你的回答,无论如何我已经学到了很多有用的东西.:)

Fre*_*ieb 6

易失性。写来救援:

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在这种特殊情况下使用..