用于在for循环内创建任务的IndexOutOfRangeException

时间:2018-12-22 13:07:19

标签: c# task-parallel-library

我遵循了一些简单的任务并行库示例。在了解了这些基础知识之后,我尝试使用任务数组,初始化每个任务并在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完成...

0 个答案:

没有答案