子任务 vs WaitAll

4

我不确定创建子任务的好处是什么,当我可以让父任务等待它所创建的所有任务时。我运行了以下代码,两种情况下都产生了相同的结果。

public static void Main(string[] args)
{
    RunWithChildren();
    RunWithWait();
}


private static void RunWithChildren()
{
    Task<Int32[]> parent = Task.Run(() =>
    {
        var results = new Int32[3];
        new Task(r => results[0] = 0, TaskContinuationOptions.AttachedToParent).Start();
        new Task(r => results[1] = 1, TaskContinuationOptions.AttachedToParent).Start();
        new Task(r => results[2] = 2, TaskContinuationOptions.AttachedToParent).Start();
        return results;
    });

    var finalTask = parent.ContinueWith(parentTask =>
    {
        foreach (int i in parentTask.Result)
            Console.WriteLine(i);
    });

    finalTask.Wait();
}


private static void RunWithWait()
{
    Task<Int32[]> parent = Task.Run(() =>
    {
        var results = new Int32[3];
        Task t1 = Task.Run(() => results[0] = 0);
        Task t2 = Task.Run(() => results[1] = 1);
        Task t3 = Task.Run(() => results[2] = 2);

        Task.WaitAll(t1, t2, t3);
        return results;
    });

    var finalTask = parent.ContinueWith(parentTask =>
    {
        foreach (int i in parentTask.Result)
            Console.WriteLine(i);
    });

    finalTask.Wait();
}
1个回答

5
AttachedToParent提供了一种不同的代码结构方式。如果子Task可以在父Task代码的不同位置开始执行,使用AttachedToParent意味着您无需担心收集所有子Task到一个集合中。
实际上,我认为Task.WaitAll()更清晰,收集Task并不是一个问题,因此我几乎不会使用AttachedToParent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接