我正在使用以下代码创建多个线程,这些线程将在给定范围(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);
答案 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())));
}
这应该为您提供正确的输出,因为您需要在将变量传递到任务中之前捕获循环内的变量。