闭包是你的问题。
基本上,不是在创建 lambda(在循环中)时获取值,而是在需要时获取它。计算机的速度如此之快,以至于当它发生时,它已经脱离了循环。值为 3。这是一个示例(先不要运行它):
private void buttonDoSomething_Click(object sender, EventArgs e)
{
List<Thread> t = new List<Thread>();
for (int i = 0; i < 3; i++)
{
t.Add(new Thread (() => Console.Write(i)));
t[i].Start();
}
}
想想你期望的结果是什么。会不会是012
你在想?
现在运行它。
结果将是333
。
这是一些修改后的代码,可以修复它:
private void buttonDoSomething_Click(object sender, EventArgs e)
{
List<Thread> t = new List<Thread>();
string[] bla = textBoxBla.Lines;
for (int i = 0; i < bla.Length; i++)
{
int y = i;
//note the line above, that's where I make the int that the lambda has to grab
t.Add(new Thread (() => some_thread_funmction(bla[y])));
//note that I don't use i there, I use y.
t[i].Start();
}
}
现在它可以正常工作了。这一次,当循环结束时,值超出范围,因此 lambda 没有选择,只能在循环结束之前获取它。这将为您带来预期的结果,也不例外。