等待来自多个对象的任务

GTH*_*ten 1 c# task task-parallel-library async-await .net-core

我有一个使用MEF加载插件的应用程序.所有这些插件都符合以下界面:

public interface IPlugin {
    Task Start();
}
Run Code Online (Sandbox Code Playgroud)

所有方法都实现为async:public async Task Start()

当应用程序运行时,我有一个IEnumerable<IPlugin>可用于所有插件的属性.问题基本上是我如何Start()并行运行所有方法并等待所有方法完成?

我知道Parallel.ForEach(plugins, plugin => plugin.Start()),但这是不可能的,并且在所有插件启动之前执行仍在继续.

最有希望的解决方案似乎是Task.WhenAll(),但我不知道如何在不添加一些脚手架(这似乎是开销)的情况下将未知的方法列表发送到此.

我怎么能做到这一点?

Ser*_*nov 6

这是一个单行:

await Task.WhenAll(plugins.Select(p => p.Start()));
Run Code Online (Sandbox Code Playgroud)

插件将异步运行,但不是并行运行.如果由于某种原因需要显式地将插件分派给线程池,可以Task.Run使用asynclambda 添加Select.

  • 臭小子,它一直盯着我的脸!您愿意详细说明“插件将异步运行,但不是并行运行”吗? (2认同)