作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
闭包捕获的变量如何与不同的线程交互?在下面的示例代码中,我想将 totalEvents 声明为易变的,但 C# 不允许这样做。
(是的,我知道这是错误的代码,这只是一个例子)
private void WaitFor10Events()
{
volatile int totalEvents = 0; // error CS0106:
_someEventGenerator.SomeEvent += (s, e) => totalEvents++;
while(totalEvents < 10)
Thread.Sleep(100);
}
编辑:人们似乎有点忽略了我的问题。我知道我不能在本地变量上使用 volatile
。我也知道示例代码代码不好,可以用其他方式实现,因此我的“错误代码”免责声明。只是为了说明问题。
无论如何,似乎没有办法将 volatile 语义强加到捕获的局部变量上,所以我将实现一种不同的方式。感谢您的回答,无论如何我已经学到了一些有用的东西。 :)
最佳答案
Volatile.Write 来拯救:
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/
我是一名优秀的程序员,十分优秀!