我遵循了一些简单的任务并行库示例。在了解了这些基础知识之后,我尝试使用任务数组,初始化每个任务并在for循环内启动该任务。该代码成功通过了编译,但是在运行时引发了IndexOutOfRangeException。
我已经搜索了社区,结果发现有一个关于使用TPL的IndexOutOfRangeException的类似问题。但是在那个线程中,问题是因为循环变量i的值是作为每个任务的输入增量直接传递的。但就我而言,事实并非如此。每个任务的输入参数已在另一个循环中预先分配。我也尝试进入该程序,在这种情况下,程序按预期完成。我想知道是否有人可以给我一些有关此问题的提示
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace TaskParallelLibrary
{
class Program
{
static void Main(string[] args)
{
int nTask = 5;
Task[] tasks = new Task[nTask];
int[] taskId = new int[nTask];
int[] slpTime = new int[nTask];
int i = 0;
for (i = 0; i < nTask; i++)
{
taskId[i] = i;
slpTime[i] = i *2*500;
}
for (i = 0; i < nTask; i++)
{
tasks[i] = Task.Factory.StartNew(() => DoWork(taskId[i], slpTime[i]));
}
Task.WaitAll(tasks);
Console.ReadKey();
}
static void DoWork( int id, int sleep)
{
Console.WriteLine("Task {0} is begining...", id);
Thread.Sleep(sleep);
Console.WriteLine("Task {0} is completed...", id);
}
}
}
预期输出:
任务1开始...
任务1开始...
任务2开始...
任务1已完成...
任务1已完成...
任务3开始...
任务4开始...
任务2已完成...
任务3完成...
任务4完成...