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());
}
我正在使用 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());
}