任务并行库 - 了解所有任务何时完成

时间:2012-02-26 08:53:12

标签: c#-4.0 task-parallel-library

我使用任务并行库来启动一些任务,如下所示:

    public static void Main()
    {
        for (var i = 0; i < 10; i++)
        {
            var x = i;
            Task.Factory.StartNew(() => new WorkerClass(x).Do());
        }

        // (*) Here I'd like to wait for all tasks to finish
        Task.WaitAll(); 

        Console.WriteLine("Ready.");
        Console.ReadLine();
    }

问题是某些任务本身可以创建新任务。这就是WorkerClass的样子:

public class WorkerClass
{
    private static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();

    private readonly int _i;

    public WorkerClass(int i)
    {
        _i = i;
    }

    public void Do()
    {
        if (_i % 3 == 0)
            Task.Factory.StartNew(() => new WorkerClass(_i + 101).Do());

        Log.Info("Started {0}", _i);
        Thread.Sleep(2000);
        Log.Info("Done {0}", _i);
    }
}

对于i的每个值为3的倍数,将启动一个新任务。

我希望能够等到所有任务(包括其他任务创建的任务)完成。

是否有干净/内置的方法(有或没有TPL)?

1 个答案:

答案 0 :(得分:15)

保留对所有顶级任务的引用,然后使用WaitAll

    var tasks = new Task[10];
    for (var i = 0; i < 10; i++)
    {
        var x = i;
        tasks[i] = Task.Factory.StartNew(() => new WorkerClass(x).Do());
    }

    Task.WaitAll( tasks );

对于子任务,只需确保将它们附加到父任务即可。这意味着在完成所有子任务之前,父任务不会进入完整状态。

    Task.Factory.StartNew(() => { }, TaskCreationOptions.AttachedToParent);