关于C#中ThreadPool的困惑



我最近正在学习C#中的ThreadPool。我写了一个小函数来测试它

static void threadTest()
{
int totalCnt = 2;
ManualResetEvent manual = new ManualResetEvent(false);
for(int i = 0; i < 2; ++i)
{
int cur = i;
Console.WriteLine("Before thread:" + cur);
ThreadPool.QueueUserWorkItem((s) => {
Console.WriteLine("In thread:" + cur);
if (Interlocked.Decrement(ref totalCnt) == 0) manual.Set();
});
Console.WriteLine("End thread:" + cur);
}
manual.WaitOne();
} 

此代码的输出为:

Before thread:0
End thread:0
Before thread:1
End thread:1
Before thread:2
End thread:2
Before thread:3
End thread:3
In thread:0
In thread:3
In thread:2
In thread:1

"线程中:xx〃;在所有循环结束后打印。但是每个线程都需要一个临时变量";cur";以输出该行。然而,据我所知,一个循环中的临时变量将在循环结束后从堆栈中删除。在这个例子中,线程仍然可以访问";cur";当它的循环结束时。谁能向我解释一下吗?谢谢!!

来自关于lambdas 的文档

Lambdas可以引用外部变量。这些变量在定义lambda表达式的方法中处于作用域中,或者在包含lambda表达式类型的作用域中以这种方式捕获的变量将被存储,以便在lambda表达式中使用,即使这些变量会超出范围并被垃圾收集。在lambda表达式中使用外部变量之前,必须对其进行明确赋值。

强调挖掘。

实际上,lambda表达式将由编译器重写为一个类,并且表达式中使用的任何外部变量都将作为该类中的字段添加。

最新更新