我已经搜索过但在任何地方都找不到明确的确认......如果一个任务有多个延续(不是链式延续),这些延续是否彼此并行?

我想运行 task1,然后是 task2-task3-task4 彼此并行,最后是 task5,当所有都完成时。下面举例。任务 2、3 和 4 肯定会彼此异步运行吗?

虽然我们正在这样做,但欢迎任何改进模式的建议。似乎有几种不同的方法来完成这个组合。谢谢

public Task MyWorkflowAsync() {
  Task task1 = Task.Factory.StartNew( () => DoTask1() );

  var tarray = new Task[] {
    task1.ContinueWith( task => DoTask2() ),
    task1.ContinueWith( task => DoTask3() ),
    task1.ContinueWith( task => DoTask4() )
  };

  return Task.Factory.ContinueWhenAll( tarray, completedTasks => DoTask5() );
}

最佳答案

不,延续由默认调度程序以 LIFO 排序执行。如果您希望它们全部并行运行,您应该这样做:

public Task MyWorkflowAsync()
{
    var tasks = new List<Task>();
    var task1 = Task.Factory.StartNew(DoTask1);

    tasks.Add(task1.ContinueWith(task => tasks.Add(Task.Factory.StartNew(DoTask2))));
    tasks.Add(task1.ContinueWith(task => tasks.Add(Task.Factory.StartNew(DoTask3))));
    tasks.Add(task1.ContinueWith(task => tasks.Add(Task.Factory.StartNew(DoTask4))));

    return Task.Factory.ContinueWhenAll(tasks.ToArray(), completedTasks => DoTask5());
}

关于.net - 任务的延续是否彼此异步运行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8522252/

10-11 02:18