gpt4 book ai didi

c# - .net 4.0 任务中的私有(private)变量

转载 作者:太空狗 更新时间:2023-10-29 20:00:25 24 4
gpt4 key购买 nike

做一些实验来了解事情是如何运作的。我有以下代码...

 for (int i = 0; i < 20; i++)
{
Task.Factory.StartNew(() => MethodTest(i));
}

我想知道为什么 MethodTest 几乎总是收到 int 20(除非我在调试器中单步执行)。

显然我的理解中缺少一些东西,因为我假设传递“i”时它将成为托管线程本地存储的一部分。

最佳答案

您正在关闭循环变量 - 试试这个:

 for (int i = 0; i < 20; i++)
{
int x = i;
Task.Factory.StartNew(() => MethodTest(x));
}

需要理解的重要一点是,您正在变量 i 上创建一个闭包,不是它的当前值

当线程池启动第一个线程(它们首先进入队列)时,变量 i 几乎肯定会是 20,因为您已经跳出循环。现在每个启动的线程都会查看变量 i 的值 在那个时间点

建议的解决方法是在循环范围内部创建一个新变量,并将i 的当前值分配给该变量。由于在循环的每次迭代中都使用了一个新变量,因此每个创建的线程现在都在关闭其“自己的”变量,该变量是隔离的并且不会更改。

解释发生了什么的标准引用是“Closing over the loop variable considered harmful”。

关于c# - .net 4.0 任务中的私有(private)变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6687571/

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