c# - 启动新线程时抛出IndexOutOfRangeException

标签 c# multithreading lambda indexoutofboundsexception

当我运行以下代码段时,将抛出IndexOutOfRangeException。当抛出异常时,看来我是2。我的理解是,更改i的值后,将启动新线程。有没有办法使该代码免受此类问题的影响?

int x[2] = {1, 3};
int numberOfThreads = 2;

for (int i = 0; i < numberOfThreads; i++)
{
    new Thread(() =>
    {
        DoWork(x[i]);
    }).Start();
}

最佳答案

问题在于捕获了i变量,并且在线程真正开始启动时为2。

改用这个:

for (int i = 0; i < numberOfThreads; i++)
{
    int value = x[i];
    new Thread(() => DoWork(value)).Start();
}

或者:
foreach (int value in x)
{
    int copy = value;
    new Thread(() => DoWork(copy)).Start();
}

或者:
for (int i = 0; i < numberOfThreads; i++)
{
    int copyOfI = i;
    new Thread(() => DoWork(x[copyOfI])).Start();
}

在每种情况下,lambda表达式都会在循环的每次迭代中捕获一个新变量-该变量不会被后续迭代更改。

通常,应避免在lambda表达式中捕获循环变量,该表达式稍后将执行。有关更多详细信息,请参见主题上的Eric Lippert's blog post

从C#5开始,很可能会更改foreach循环行为以避免出现问题-但是for循环等效项仍然会成为问题。

关于c# - 启动新线程时抛出IndexOutOfRangeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7867906/

相关文章:

c# - 在 C# 中使用线程构建分布式 DFS

c# - 传入可为空的 Expression<Func<T, TResult>>?作为方法参数?

c# - 如何从 HttpPostedFile 创建字节数组

c# - Entity Framework 6 - 多个 DefaultConnectionFactory?

c - 如何防止此 pthread 同步内存踩踏?

c++ - 英特尔tbb内存开销

c# - 创建任务时List Index Out of Range异常

java - JavaFX8 中使用 FXML 的 Lambda 函数

c# - Task.Factory.FromAsync 如何工作/表现?

c# - 返回类实例的默认 ToString() c#