随意运行代码
Thread thread;
for (int i = 6000; i < 6006; i++)
{
//Thread.Sleep(1);
thread = new Thread(() => derp(i));
thread.IsBackground = true;
thread.Start();
}
private void derp(int a)
{
MessageBox.Show(a.ToString());
}
虽然线程睡眠很好但是有人得到了解释吗?
答案 0 :(得分:1)
这不奇怪,你会学到它。这个概念叫做Capture and Closure
Closure (computer programming)
在编程语言中,闭包(也是词法闭包或函数 closure)是一种用于实现词法范围的名称绑定的技术 用具有一流功能的语言。在操作上,关闭是 将函数[a]与环境一起存储的记录。1 environment是一个关联每个自由变量的映射 function(在本地使用但在封闭中定义的变量) scope)具有名称绑定的值或引用 封闭是创建的。[b]封闭 - 不像普通的功能 - 允许 通过闭包访问这些捕获变量的函数 它们的值或引用的副本,即使函数是 在他们的范围之外调用。
解决这个问题非常简单。我们创建了一个包含值副本的局部变量,而不是捕获“for”循环的索引器。
for (int i = 6000; i < 6006; i++)
{
var capturedIndex = i;
thread = new Thread(() => derp(capturedIndex ));
thread.IsBackground = true;
thread.Start();
}