3

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

它可能有用的一个有趣领域是切换执行上下文,例如ControlAwaiter来自 Stephen 的博客或ContextSwitcher来自这个问题。然而,这并不是一个好的做法,AFAIU。

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

4

1 回答 1

7

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

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

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

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

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

于 2013-10-23T14:38:30.190 回答