我目前正在进入async / await关键字,并经历了以下问题:When correctly use Task.Run and when just async-await和Async/Await vs Threads
然而即使是第二个链接也没有回答我的问题,即何时只使用
Task.Run(...)
与
await Task.Run(...)
是情境化还是通过使用等待(并因此返回调用者)可以获得某些东西?
答案 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(),因为它会暂停当前执行,直到您的任务完成。