您将如何实现与“异步CTP” await关键字类似的功能?是否有一个简单的实现在所有情况下都像await一样起作用,还是await在不同情况下需要不同的实现?

有帮助吗?

解决方案

await总是涉及相同的转换-但这是非常痛苦的。await library 并不太复杂,但是棘手的一点是,编译器为您构建了一个状态机,允许继续跳转回到正确的位置。

可能,我对迭代器块(收益回报)的某些恶意使用,您可以伪造类似的东西……但这将非常丑陋。

我进行了 DevExpress网络研讨会,介绍了几周前编译器在后台进行的操作-其中显示了几个示例中的反编译代码,并说明了编译器如何构建要返回的任务以及“等待者”必须做什么。这可能对您有用。

其他提示

新的await关键字与现有的yield return关键字具有相似的语义,因为它们都使编译器为您生成延续样式状态机。因此,可以使用与Async CTP具有某些相同行为的迭代器将某些东西合并在一起。

这里是它的样子。 通用标签

由于yield return生成了IEnumerable,我们的协程必须返回IEnumerable。所有的魔术都发生在AsyncHelper.Invoke方法内部。这就是使我们的协程(伪装成被入侵的迭代器)运行的原因。如果存在迭代器,要特别小心以确保始终在当前同步上下文上执行该迭代器,这在尝试模拟await如何在UI线程上工作时非常重要。它是通过同步执行第一个MoveNext,然后使用SynchronizationContext.Send从工作线程执行其余任务来完成的,该工作线程也用于异步等待各个步骤。 通用标签

有关TaskCompletionSource的全部内容是我尝试复制await可以“返回”值的方式。问题是协程必须实际返回一个IEnumerable,因为它只不过是一个被黑的迭代器。因此,我需要提出一种替代机制来捕获返回值。

此操作有一些明显的局限性,但我希望这能为您提供总体思路。它还说明了CLR 如何可以具有一种通用的实现协程的机制,generaodicetagcode和await会普遍使用该协程,但是会以不同的方式提供它们各自的语义。

由迭代器(产量)构成的协程的实现和示例很少。

示例之一是Caliburn.Micro框架,该框架使用此模式进行异步GUI操作。但是可以很容易地将其概括为通用异步代码。

MindTouch DReAM 框架在Iterator模式的顶部实现了协程,该模式在功能上与Async /非常相似等待: 通用标签

vs。 通用标签

Result是DReAM的Task版本。框架dll可与.NET 2.0+一起使用,但要构建它,您需要3.5,因为这些天我们使用了很多3.5语法。

微软的

比尔·瓦格纳(Bill Wagner)写了有关MSDN杂志的文章您可以使用Visual Studio 2010中的任务并行库来实现类似异步的行为,而无需添加对异步ctp的依赖。

它广泛使用了TaskTask<T>,这还有一个附加的好处,即一旦C#5发布,您的代码将为开始使用asyncawait做充分的准备。

根据我的阅读,yield returnawait之间的主要区别在于,await可以显式地向续集返回新值。 通用标签

使用yield return时,您必须通过引用来完成相同的事情。 通用标签

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top