【问题标题】:Should one await a background, fire-and-forget Task? [duplicate]是否应该等待一个背景、即发即弃的任务? [复制]
【发布时间】:2017-01-23 23:26:13
【问题描述】:

这两种即发即弃的选择有什么区别:

HostingEnvironment.QueueBackgroundWorkItem(async () => await UpdateStatsAsync(id))

HostingEnvironment.QueueBackgroundWorkItem(() => UpdateStatsAsync(id))

当涉及到排队一些客户端并不真正需要依赖的后台工作时?

【问题讨论】:

  • @Icemanind:谢谢,这些答案并不明确,而且相互矛盾。 Stephen Cleary 在那里的回答谈到了一般的异步与同步案例:/
  • 接受的答案详细而准确。 Cleary 的回答是一个奇怪的贡献。似乎并没有真正解决所提出问题的实际要素。但这并不意味着该问题与您的问题不完全相同。
  • 嗯。我回答的时候你关门了。我把我的答案记录在这里,如果只是为了发泄一下。不同之处在于 - 第一个虚假地将 UpdateStatsAsync() 包装在一个额外的任务中,稍后必须再次解包。 - 第二个更容易阅读。
  • 重新开放;这个问题是关于将异步工作排队到 QBWI 的两种不同方法; the other question 是关于排队异步工作与排队同步工作。

标签: c# asp.net task background-process


【解决方案1】:

在这种情况下,我将使用非异步版本,因为 HostingEnvironment.QueueBackgroundWorkItem 有一个重载,它接受 CancellationToken 并返回一个 Task,所以您的代码如下所示:

HostingEnvironment.QueueBackgroundWorkItem(ct => UpdateStatsAsync(id));

在内部这个重载awaits 这个函数给你。这种方法的一个缺点是,如果您从 using 范围内或 try/catch 返回 Task,您可能会因为不等待您的 Task 而感到惊讶,但在这个简单的场景中,您应该不用担心这个。

【讨论】:

  • 这些惊喜是因为HostingEnvironment.QueueBackgroundWorkItem 中的底层async void 实现?
  • 类似的是,所以如果你有一个try/catch,如果你没有awaitTaskTask块内返回方法,你会返回一个 Task 在等待时会抛出。如果您认为自己正在捕获该错误,这很容易被原谅,但是由于您没有在 inside try 块中等待,因此您不会在那里捕获异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多