【发布时间】:2021-11-30 14:30:27
【问题描述】:
我正在使用BackgroundWorker 升级旧代码。 Following a series of articles from Stephen Cleary 在这件事上,我认为这种情况下理想的替代品是Task.Run()。
Mine 是一个 Windows 窗体应用程序。构造表单时,会启动不同的后台操作,并将其结果收集到不同的事件处理程序中,按照BackgroundWorker 模式。
现在,我的新方法遵循 async/await 模式。我 have some concerns 关于在异步方法上调用 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 重构为非异步 void,从而改变它们的内部行为 like suggested here in "How to call asynchronous method from synchronous method"?我还缺少更好的选择吗?
【问题讨论】:
-
这个问题与您所问的有关吗? await Task.Run vs await
-
我犯了一个初始错误,
await Task.Run(async () => await Method());在第一个指令完成之前不会运行以下指令,因此我进行了编辑。 -
如果任务长时间运行(并且不受 IO 限制),最好使用任务并行库 (TPL)。在不知道任务在做什么的情况下很难给出强有力的建议。 docs.microsoft.com/en-us/dotnet/standard/parallel-programming/…
-
@KieranDevlin 任务基本上是通过枚举文件或查询数据库从磁盘或网络读取数据
-
@ccalboni 那就忽略我的评论吧。
标签: c# .net winforms task-parallel-library .net-framework-4.8