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