异步操作运行时继续工作流程

时间:2017-12-21 11:44:51

标签: c# .net asynchronous async-await

我对Eric Lippert's answerWhat's the difference between Task.Start/Wait and Async/Await?

发表了评论

我问这个问题,因为我仍然不确定我是否正确理解了这个概念以及我是如何实现目标的。添加大量评论对任何人都没有帮助。

我的理解: await告诉编译器当前线程有能力执行其他一些计算,并在等待操作完成后返回。这意味着工作流程将中断,直到等待的操作完成。这不会加快包含await的上下文的计算速度,但会因为更好地使用 worker 而提高整体应用程序性能。

没问题:我想继续工作流程,最后确保操作完成。所以基本上允许 worker 继续当前工作流程,即使等待操作未完成并等待工作流结束时完成。我希望 worker 花时间在我的工作流程上而不是逃跑并帮助其他人。

我认为可行的方法:考虑 n async Add操作和处理添加项目的Flush操作。 Flush需要添加项目。但添加项目不需要添加上一项。所以基本上我想收集所有正在运行的 Add操作,并在添加所有操作后等待所有操作。在他们等待之后,他们应该Flush编辑。

  1. 我可以通过将Add任务添加到列表中来完成此操作,并最终等待所有这些任务吗?
  2. 或者这是伪同步并且最终没有任何好处?
  3. 是否与直接等待所有Add操作相同? (不收集它们)

2 个答案:

答案 0 :(得分:8)

  

我的理解:await告诉编译器当前线程有能力执行其他一些计算,并在等待操作完成后返回。

非常接近。表征它的更好方法是:await意味着暂停此工作流,直到等待的任务完成。如果由于任务未完成而暂停工作流,则释放该线程以找到更多工作要做,并且工作流将被安排在任务完成时的某个时间点恢复。等待时做的选择是最近调用此工作流的代码;也就是说,await实际上是一种奇特的return。毕竟,return表示"让我的来电者决定下一步做什么"。

如果任务在await点完成,那么工作流程就会正常继续。

Await是异步等待。它等待完成任务,但在等待时它会一直忙着。

  

我想继续工作流程,最后确保操作完成。所以基本上允许工作人员继续当前的工作流程,即使等待的操作没有完成并等待工作流程结束时完成。我希望工人花时间在我的工作流程上而不是逃跑并帮助别人。

当然,那没关系。在工作流程可以继续之前,需要完成任务时,不要等待任务直到最后一刻。这是最佳做法。

但是:如果您的工作流程执行的操作超过了30毫秒而没有等待某些事情,并且您在UI线程上,那么您可能会冻结UI并激怒用户

  

我可以通过将添加任务添加到列表并最终等待所有这些任务来完成此操作吗?

当然可以;这是一个好主意。使用WhenAll组合器轻松等待所有一系列任务。

  

是否与直接等待所有Add操作相同? (不收集它们)

不,它有所不同。正如您所正确注意的那样,等待每个Add操作将确保在上一个完成之前不会启动Add。如果没有要求以这种方式序列化,您可以先启动任务,然后在它们全部启动后等待它们,从而提高工作效率。

答案 1 :(得分:3)

如果我理解你的问题,你想要做的是并行化异步工作,这很常见。

请考虑以下代码:

A