C# 循环繁殖(后台)线程的异常行为

C# 循环繁殖(后台)线程的异常行为,c#,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()); } 不

请随意运行代码

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());
}
不过,它和线程睡眠配合得很好,有人解释过吗


这并不奇怪,你会学到的。这个概念被称为捕获和闭包

在编程语言中,闭包也是词法闭包或函数 闭包是一种实现词汇范围名称绑定的技术 在一种具有一流功能的语言中。在操作上,关闭是必要的 存储函数[a]和环境的记录。这个 环境是一个映射,它将 本地使用但在封闭空间中定义的函数变量 范围,该值或引用在 已创建闭包。[b]与普通函数不同的闭包允许 通过闭包的 其值或引用的副本,即使函数 在其范围之外调用

这个问题的解决方法很简单。我们不是捕获for循环的索引器,而是创建一个局部变量来保存值的副本

for (int i = 6000; i < 6006; i++)
{
    var capturedIndex = i;
    thread = new Thread(() => derp(capturedIndex ));

    thread.IsBackground = true;
    thread.Start();
}