我的代码有一个非常奇怪的问题。它将完全运行1st for循环,然后完成foreach,但随后它将跳回到“ThreadStart IMAPDelegate”(for循环的第1行),然后由于ArgumentOutOfRangeException而崩溃。有人可以解释为什么程序这样做?我逐行调试它,它实际上只是跳回到for循环中的一行。如果它再次正常运行for循环,它会将x设置为0并且它不会崩溃。有什么建议吗?
for (int x = 0; x < UserInfo.Count; x++)
{
ThreadStart IMAPDelegate = delegate{SendParams(UserInfo[x], IMAPServers[x]); };
MyThreads.Add(new Thread(IMAPDelegate));
}
foreach (Thread thread in MyThreads)
{
thread.Start();
}
答案 0 :(得分:5)
当您使用这样的匿名方法时,这是设计使然。一旦线程开始运行,它就会执行SendParams()方法调用。然后爆炸,因为“x”变量已经增加超出UserInfo.Count。修正:
for (int x = 0; x < UserInfo.Count; x++)
{
int user = x;
ThreadStart IMAPDelegate = delegate{SendParams(UserInfo[user], IMAPServers[user]); };
MyThreads.Add(new Thread(IMAPDelegate));
}