【发布时间】:2013-07-20 00:45:57
【问题描述】:
我在一个循环中启动 4 个线程。每个线程获取对数组元素的引用以写入结果。
但是在我创建每个线程的那一行,我得到一个System.IndexOutOfRangeException。我很惊讶索引“i”超出了范围。
这是一个例子:
void ThreadsStarter()
{
double[] data = new double[4];
for(int i = 0; i < 4; i++)
{
Thread my_thread = new Thread(() => Work(data[i]));
my_thread.Start();
}
}
void Work(double data)
{
}
为什么会这样?
【问题讨论】:
-
我已从您的示例/标题中删除了与问题无关的
ref- 请随时编辑/回滚。注意ref通常很难使用/理解,尤其是当您开始使用更灵活的集合(如List<double>而不是Array)时。尽量避免使用ref- 即在这种情况下,Tuple.Create(data, i)可能是一个选项(显然是在 lambda 之前创建以避免您现在遇到的问题)。 -
谢谢。现在我也知道那个结构的名称(闭包/lambdas)。我确实尽量避免参考。我会考虑改用元组,这看起来更干净。这是一篇好文章 Blorgbeard。
标签: c# arrays multithreading indexoutofboundsexception ref