用于创建不同线程的循环产生多个相同的线程

时间:2014-02-21 02:33:11

标签: c# multithreading

我正在使用以下代码创建多个线程,这些线程将在给定范围(min,max)的数组上工作

当我运行此代码时,只修改了数组的下半部分,所以我将名称字段放入Threads.advance,这样我就可以打印出线程的编号,当我得到以下内容时:< / p>

Thread Stopped: 2 Range: 25 50
Thread Stopped: 2 Range: 25 50

这令人困惑,原因有两个:

1)numThreads变量为2,因此for循环应该从0到1,但名称打印为2。

2)所有正在生成的线程都具有相同的范围和名称,即使我传入的值在for循环期间发生了变化。

Task[] tasks = new Task[numThreads];
int minRange, maxRange;
for (int i = 0; i < numThreads; i++)
{
    minRange = worldlength / numThreads * i;
    maxRange = worldlength / numThreads * (i + 1);
    tasks[i] = (Task.Factory.StartNew(() => Threads.advance(minRange, maxRange, i.ToString())));
}                    
Console.WriteLine();
Task.WaitAll(tasks);

1 个答案:

答案 0 :(得分:2)

尝试将循环更改为:

// int minRange, maxRange; - declare inside loop instead!!
for (int i = 0; i < numThreads; i++)
{
    var i2 = i;
    int minRange = worldlength / numThreads * i;
    int maxRange = worldlength / numThreads * (i + 1);
    tasks[i] = (Task.Factory.StartNew(() => 
            Threads.advance(minRange, maxRange, i2.ToString())));
}   

这应该为您提供正确的输出,因为您需要在将变量传递到任务中之前捕获循环内的变量。