【问题标题】:What is a good alternative to await Task.Run executing an asyncronous lambda?什么是等待 Task.Run 执行异步 lambda 的好选择?
【发布时间】: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


【解决方案1】:

使用Task.WhenAll

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

}

【讨论】:

  • @ccalboni 所以AwaitableLongRunningTask_1 不是异步实现的?
  • @ccalboni 是的,您使用了Thread.Sleep,这绝对是非异步的!注意我使用的Task.Delay 是异步的
  • @TheodorZoulias “在 AwaitableLongRunningTask_1 完成之前,AwaitableLongRunningTask_2 不会启动。” JamieC 发布的小提琴清楚地表明了相反的情况
  • @MongZhu 调用异步方法是一回事。当调用完成时,它返回一个Task。等待这个任务是另一回事。 ccalboni 的评论指的是异步方法的调用。该评论中没有提到等待返回的任务。也许他们打算说的是错的,但他们字面意思说的是对的。调用肯定是顺序的。返回的任务可能是并发的。这取决于它们是如何实现的。但他们是否并发与ccalboni的评论无关。
  • @TheodorZoulias 好吧,现在我明白了。感谢您抽出宝贵时间撰写此详尽的解释。我同意,现在我的视野更广阔了:)干杯伙伴
猜你喜欢
  • 2012-11-12
  • 1970-01-01
  • 1970-01-01
  • 2015-09-28
  • 1970-01-01
  • 1970-01-01
  • 2021-06-23
  • 1970-01-01
  • 2019-02-26
相关资源
最近更新 更多