【问题标题】:Any practical use for custom awaiters?自定义等待者有什么实际用途吗?
【发布时间】:2013-10-23 02:57:40
【问题描述】:

在 Stephen Toub 的 Await Anything 博客文章中有一些有趣的自定义等待者示例。我特别喜欢await task.WithCulture() 模式,我认为它在现实生活中很有用。但是,我想不出任何其他可能无法用TaskCompletionSource 完成的事情。

它可能有用的一个有趣领域是切换执行上下文,例如斯蒂芬博客中的ControlAwaiterthis question 中的ContextSwitcher。然而,这并不是一个好的做法,AFAIU。

看看其他一些实用且有用的自定义等待器示例会很有趣,它们仍然不会损害代码的可读性和可维护性

【问题讨论】:

  • 列出问题(在这种情况下,要求列出所有可能使用自定义等待者的列表)本质上不太适合 SO。此类问题无法给出具体、具体、可验证的正确答案。
  • @Servy,除了await task.WithCulture()之外,如果我把它从some other改成any可以吗?
  • 不,这不会有什么不同。
  • 从票数来看,很多人对这个问题感兴趣。这个问题非常具体,它甚至包括一个答案示例(顺便谢谢!),它回答了一个关于 TPL(如何流动文化)的常见 SO 问题。
  • @PanagiotisKanavos 在考虑是否应该关闭问题时,人气依赖。仅仅因为一个问题很受欢迎并不能使它适合该网站。不,这并不具体。任何可能的自定义任务等待者都非常广泛;没有什么特别的。

标签: c# .net task-parallel-library async-await


【解决方案1】:

自定义等待者的实际用例很少。

但是,有一些示例似乎属于以下类别之一:

  1. 出于性能原因避免使用Task。 Windows 应用商店平台通过自定义等待对象公开其(非托管)异步操作。另一个例子是 Stephen Toub 的 awaitable wrapper for the specialized Socket asynchronous API 用于高流量内存密集型场景。
  2. 修改现有等待的行为。例如,ConfigureAwait(false)WithCurrentCulture you mentioned
  3. 启用可等待对象的重用。 this blog post 中的“事件等待者”类型满足每个引发的事件一个 await。相比之下,任务只能完成一次。

Task.Yield 也使用自定义的可等待对象,但它似乎属于自己的一个类别。

就我个人而言,我避免自定义等待对象。通常类别 (1) 仅被认为是过早的优化。类别 (2) 在概念上很有趣,但如果您仔细研究,您会发现行为修饰符的组合并不好。类别 (3) 也很有趣,但 IMO 更具争议性,因为完成语义可能令人惊讶。

【讨论】:

  • 一个很好的答案,像往常一样。
猜你喜欢
  • 2012-12-31
  • 1970-01-01
  • 2011-05-06
  • 2018-08-07
  • 2011-04-25
  • 2011-10-17
  • 2011-05-04
  • 2011-10-29
  • 2011-04-02
相关资源
最近更新 更多