【发布时间】:2015-11-17 18:51:24
【问题描述】:
Await 关键字与可等待类型一起使用(.NET 带有现有的两种此类类型,Task 和 Task<T>)。但是,您可以编写自己的可等待类型。
msdn blog post 声明:
你可以想到下面的代码:
await FooAsync(); RestOfMethod();本质上与此相似:
var t = FooAsync(); var currentContext = SynchronizationContext.Current; t.ContinueWith(delegate { if (currentContext == null) RestOfMethod(); else currentContext.Post(delegate { RestOfMethod(); }, null); }, TaskScheduler.Current);
上面的(伪)代码是否遵循可等待类型的实现(例如Task),或者可能只是编译器处理任何可等待类型的方式await 关键字的右侧?
在下面的 cmets 部分,有一篇文章解释了 TaskScheduler 和 SynchronizationContext 之间的区别。
主要区别在于 SynchronizationContext 是一个通用的 与委托合作的机制,而 TaskScheduler 是 特定于并迎合任务(您可以获得一个 TaskScheduler 包装一个 SynchronizationContext 使用 TaskScheduler.FromCurrentSynchronizationContext)。这就是为什么 等待任务将两者都考虑在内,首先检查 SynchronizationContext(作为大多数 UI 中更通用的机制) 框架支持),然后回退到 TaskScheduler。 等待不同类型的对象可能会选择首先使用 SynchronizationContext,然后回退到其他一些机制 特定于该特定类型。
如果我正确理解最后一句话,这意味着我可以将我想要的任何委托放入continueWith 方法中(我的意思是上面代码示例中的t.ContinueWith 调用),即修改await 在与我的自定义等待对象。
以防万一您想了解更多: http://blogs.msdn.com/b/pfxteam/archive/2009/09/22/9898090.aspx
【问题讨论】:
标签: c# asynchronous async-await