在C#中创建一个线程数组

时间:2010-12-30 16:11:03

标签: c# multithreading

我的代码有一个非常奇怪的问题。它将完全运行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();
}

1 个答案:

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