繁体   English   中英

是否将await用于后台线程?

[英]Use await for background threads or not?

我目前正在使用async / await关键字,并经历了以下问题: 正确使用Task.Run以及何时仅使用async-awaitAsync / Await与线程

但是,即使第二个链接也无法回答我的问题,那就是何时使用

Task.Run(...)

await Task.Run(...)

是情境还是通过使用await(然后返回到调用方)可以得到什么?

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

因此,如果满足以下任一条件 ,则应使用Task

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

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

await Task.Run(...);

长时间运行的后台任务,有时你想要做的那些(例如,检测例外),但你不想做的时候了 ; 在这种情况下,只需保存Task ,然后在应用程序中的其他位置await它:

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

如果您不需要上述任何一项,则可以执行“射击后遗忘”,如下所示:

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

请注意,真正的“一劳永逸”应用程序极为罕见 字面上的意思是“运行此代码,但是我不在乎它是否完成,何时完成或是否成功”。

您可以在使用即发即类型处理逻辑时使用Task.Run() ,类似于如果有人订阅了事件则调用事件。 您可以将其用于日志记录,通知等。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM