await Task.Run 执行异步 lambda 的替代方法是什么?

What is a good alternative to await Task.Run executing an asyncronous lambda?

我正在使用 BackgroundWorker 升级旧代码。 Following a series of articles from Stephen Cleary在这件事上,我认为在这种情况下理想的替代是Task.Run()

我的是 Windows 表单应用程序。构建表单时,将启动不同的后台操作,并将其结果收集到不同的事件处理程序中,按照 BackgroundWorker 模式。

现在,我的新方法遵循 async/await 模式。我 关于在异步方法上调用 Task.Run()

private async void FormEventHandler(object sender, EventArgs e)
{
    Task.Run(async () => await AwaitableLongRunningTask_1());
    Task.Run(async () => await AwaitableLongRunningTask_2());
    //...
}

AwaitableLongRunningTask_1 和 _2 需要是异步的,因为它们在方法体内进行的调用是对异步方法的调用。

我无法通过简单的等待连续调用它们:

private async void FormEventHandler(object sender, EventArgs e)
{
    await AwaitableLongRunningTask_1();
    await AwaitableLongRunningTask_2();
    //...
}

因为它们需要并行启动,而且它们显然很长 运行 任务,跨越几秒钟。

所以我的问题是,我是否需要将 AwaitableLongRunningTasks 重构为非异步无效,从而改变它们的内部行为 like suggested here in "How to call asynchronous method from synchronous method"?我还缺少更好的选择吗?

使用Task.WhenAll

private async void FormEventHandler(object sender, EventArgs e)
{
    await Task.WhenAll( 
            AwaitableLongRunningTask_1(), 
            AwaitableLongRunningTask_2());

}