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

Tob*_*ler 6 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();

    }
}
Run Code Online (Sandbox Code Playgroud)

Cod*_*lla 5

Task.WhenAll()将采用 , 的数组Task,并且ConcurrentBag<T>支持ToArray()扩展方法,因此您可以简单地执行以下操作:

await Task.WhenAll(RunningTasks.ToArray())
Run Code Online (Sandbox Code Playgroud)

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

Task.WhenAll(RunningTasks.ToArray()).Wait()
Run Code Online (Sandbox Code Playgroud)

更新

因此,如果您RunningTasks在初始调用后更改,您可以很容易地执行此操作来处理它:

while(RunningTasks.Any(t=>!t.IsCompleted))
{
    Task.WhenAll(RunningTasks.ToArray());
}
Run Code Online (Sandbox Code Playgroud)

相对于您的方法的主要好处是,这将在线程等待时将线程交给其他工作,在那里您的代码将线程处于睡眠状态,直到所有任务完成。