gpt4 book ai didi

c# - 将局部变量传递给 .net 中的另一个线程

转载 作者:太空宇宙 更新时间:2023-11-03 22:40:18 25 4
gpt4 key购买 nike

在下面的代码中,为什么我们没有得到 NullReference 异常并且 var2 值为 56 尽管 TestMethod 肯定在 'Messagebox' 行之前完成?我读了this Eric Lippert 和 this 的出色回答博文,但我还是不明白。

void TestMethod()
{
int var1 = 10;
List<long> list1 = new List<long>();
for (int i = 0; i < 5; i++)
list1.Add(i);

ThreadPool.QueueUserWorkItem(delegate
{
int var2 = var1;
Thread.Sleep(1000);
list1.Clear();
MessageBox.Show(var2.ToString());
});
var1 = 56;
}

最佳答案

我认为这是因为委托(delegate)围绕变量 var1 形成了闭包。可能看看闭包在内部是如何工作的会对你有所帮助。可以引用说明here

The compiler (as opposed to the runtime) creates another class/type. The function with your closure and any variables you closed over/hoisted/captured are re-written throughout your code as members of that class. A closure in .Net is implemented as one instance of this hidden class.

有了那个,我相信编译器生成的代码大致如下所示:

void TestMethod()
{
UnspeackableClosureClass closure = new UnspeackableClosureClass(10);
List<long> list1 = new List<long>();
for (int i = 0; i < 5; i++)
list1.Add(i);

ThreadPool.QueueUserWorkItem(closure.AutoGeneratedMethod);
closure.closureVar = 56;
}

public class UnspeackableClosureClass
{
public int closureVar;
public UnspeackableClosureClass(int val){closureVar=val}

public void AutoGeneratedMethod(){
int var2 = closureVar;
Thread.Sleep(1000);
list1.Clear();
MessageBox.Show(var2.ToString());
}
}

关于c# - 将局部变量传递给 .net 中的另一个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52566283/

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