是否使用等待后台线程?

时间:2017-03-27 11:43:36

标签: c# .net asynchronous async-await

我目前正在进入async / await关键字,并经历了以下问题:When correctly use Task.Run and when just async-awaitAsync/Await vs Threads

然而即使是第二个链接也没有回答我的问题,即何时只使用

Task.Run(...)

await Task.Run(...)

是情境化还是通过使用等待(并因此返回调用者)可以获得某些东西?

2 个答案:

答案 0 :(得分:4)

代码Task.Run(...)(在两个示例中)将一个委托发送到线程池并返回一个包含该委托结果的任务。这些“结果”可以是实际的返回值,也可以是例外。您可以使用返回的任务来检测结果何时可用(即代表何时完成)。

因此,如果以下任何,则应使用Task

  • 您需要检测操作何时完成并以某种方式响应。
  • 您需要知道操作是否成功完成。
  • 您需要处理操作中的异常。
  • 您需要对操作的返回值执行某些操作。

如果您的调用代码需要执行其中任何操作,请使用await

await Task.Run(...);

对于长时间运行的后台任务,有时您需要执行这些任务(例如,检测异常),但您不想立即执行 ;在这种情况下,只需将Task然后await保存在应用程序的其他位置:

this.myBackgroundTask = Task.Run(...);

如果您不需要上述任何,那么您可以“发射并忘记”,如下:

var _ = Task.Run(...); // or just "Task.Run(...);"

请注意,真正的“即发即弃”应用程序非常罕见。它实际上是在说“运行这段代码,但我不关心它是否完成,何时完成,或者它是否成功”。

答案 1 :(得分:1)

使用fire和forget类型处理逻辑时,可以使用 Task.Run(),类似于有人订阅它们时调用事件。您可以使用它来记录,通知等。

如果您依赖于方法中执行的结果或操作,则需要使用等待Task.Run(),因为它会暂停当前执行,直到您的任务完成。