gpt4 book ai didi

c# - 使闭包捕获的变量易变

转载 作者:可可西里 更新时间:2023-11-01 08:10:24 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com