在Stephen Toub的Await Anything博文中有一些有趣的自定义等待者的例子。我特别喜欢await task.WithCulture()
模式,我觉得它在现实生活中很有用。但是,我无法想到使用TaskCompletionSource
可能无法完成的任何其他事情。
可能有用的一个有趣的领域是切换执行上下文,例如来自Stephen博客的ControlAwaiter
或来自this question的ContextSwitcher
。然而,这不是一个好的做法,AFAIU。
有趣的是看到一些其他实用且有用的自定义等待者示例,它们仍然不会损害代码可读性和可维护性。
答案 0 :(得分:7)
自定义等待者的现实使用案例非常少。
然而,有一些例子,似乎适合这些类别中的一个:
Task
。 Windows应用商店平台使用自定义等待来公开其(非托管)异步操作。另一个例子是Stephen Toub的awaitable wrapper for the specialized Socket
asynchronous API用于高流量内存密集型场景。ConfigureAwait(false)
或WithCurrentCulture
you mentioned。await
次。相比之下,任务只能完成一次。 Task.Yield
也使用自定义等待,但它似乎属于一个类别。
就个人而言,我避免定制等待。通常,类别(1)仅被视为过早优化。类别(2)在概念上很有趣但是如果你探索它,你会发现行为修饰符不能很好地构成。类别(3)也很有趣,但更有争议的IMO因为完成语义可能会令人惊讶。