暂停一项任务进行多次迭代

Suspend one task for several iterations

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

例如,我有这个任务数组,我想在 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);

而不是使用 Task.Run,您可以使用 new Task() 和 task.Start() 来控制何时开始任务(在您的情况下 0 < j < 3)

Task task = new Task(() => { 
                            iteration++;
                            Console.WriteLine("Task" + iteration); 
                         });
task.Start();

一个任务可能会启动并且运行只能启动一次。任何第二次安排任务的尝试都将导致异常。

建议用户 Task.Run 或 Task.Factory.StartNew(不要使用 task.Start)除非你有理由使用 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)。它将等待所有任务完成(并且不会阻塞单个任务)