暂停一个任务多次迭代

时间:2017-12-22 12:36:26

标签: c# async-await suspend

我想知道是否可以将一个任务暂停到特定的迭代次数(而不是特定的时间)?

例如,我有这个任务数组,我想在迭代中暂停数组中的一个任务,其中0< j< 3。

int iteration = 0;
var tasksArray = new Task[NUM_THREADS];

for (int j = 0; j < NUM_REPEAT_THREADS; j++)
{
    for (int i = 0; i < NUM_THREADS; i++)
    {
        tasksArray[i] = Task.Run(() =>
        {
            iteration++;
            Console.WriteLine("Task" + iteration);
        });
       tasksArray[i].Wait();

    }
    iteration = 0;
}

Task.WaitAll(tasksArray);

1 个答案:

答案 0 :(得分:0)

您可以使用新的Task()和task.Start()来控制何时启动任务(在您的情况下,0&lt; j&lt; 3)

,而不是使用Task.Run。
Task task = new Task(() => { 
                            iteration++;
                            Console.WriteLine("Task" + iteration); 
                         });
task.Start();

任务可以启动并仅运行一次。任何第二次安排任务的尝试都将导致异常。

除非您有理由使用task.Start()),否则建议用户使用Task.Run或Task.Factory.StartNew(并且不要使用task.Start)。执行此操作的一种情况是,您需要将任务的创建与其执行分开,例如当您有条件地执行您创建的任务时。

更多细节: https://msdn.microsoft.com/en-us/library/dd270682(v=vs.110).aspx

https://blogs.msdn.microsoft.com/pfxteam/2010/06/13/task-factory-startnew-vs-new-task-start/

下面的行也导致同步等待任务完成。

  tasksArray[i].Wait(); 

理想情况下,只应使用Task.WaitAll(tasksArray)。它将等待所有任务完成(并且不会阻止单个任务)