等待动态创建的任务,直到完成

时间:2016-03-28 14:41:53

标签: c# multithreading task

我的程序正在创建一些任务来完成一些工作。 现在我想在退出程序之前等待所有任务完成。

我知道Task.WaitAll(...)方法,但在我的情况下,我想动态创建一些任务 - >在调用Task.WaitAll()时它们不存在。

我现在的问题是: 如何完成所有正在运行的任务?

这就是我现在正在做的事情。

它有效,但我想确保这也是一个很好的方法。

public class Test
{
    public ConcurrentBag<Task> RunningTasks { get; set; } 

    public Test()
    {
        RunningTasks = new ConcurrentBag<Task>();
    }

    public void RunIt(){

        //...create some Tasks asynchronously so they may be created in a few seconds and add them to the list like
        //RunningTasks.Add(...);


        //Just wait until all tasks finished.
        var waitTask = Task.Run(() =>
        {
            while (true)
            {
                if (RunningTasks.All(t => t.IsCompleted))
                    break;

                Thread.Sleep(1000);
            }
        });

        waitTask.Wait();

    }
}

1 个答案:

答案 0 :(得分:4)

Task.WhenAll()将采用Task数组,而ConcurrentBag<T>支持ToArray()扩展方法,因此您只需执行以下操作:

await Task.WhenAll(RunningTasks.ToArray())

或者如果您不想使用await关键字:

Task.WhenAll(RunningTasks.ToArray()).Wait()

<强>更新

因此,如果您的RunningTasks在初次通话后发生变化,您可以很轻松地完成此操作:

while(RunningTasks.Any(t=>!t.IsCompleted))
{
    Task.WhenAll(RunningTasks.ToArray());
}

与你的方法相比,主要的好处是,它会在等待时产生其他工作的线程,你的代码会将线程置于休眠状态,直到完成所有任务。