定制等待者的任何实际用途?

时间:2013-10-23 02:57:40

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

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

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

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

1 个答案:

答案 0 :(得分:7)

自定义等待者的现实使用案例非常少。

然而,有一些例子,似乎适合这些类别中的一个:

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

    就个人而言,我避免定制等待。通常,类别(1)仅被视为过早优化。类别(2)在概念上很有趣但是如果你探索它,你会发现行为修饰符不能很好地构成。类别(3)也很有趣,但更有争议的IMO因为完成语义可能会令人惊讶。