循环生成(背景)线程的奇怪行为

时间:2018-03-24 02:51:04

标签: c#

随意运行代码

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());
}

虽然线程睡眠很好但是有人得到了解释吗?

enter image description here

1 个答案:

答案 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();
}