在 python 中,yield 关键字可用于推送和拉取上下文,我知道如何在 c# 中执行拉取上下文,但我将如何实现推送。我发布了我试图在 c# 中从 python 复制的代码:
def coroutine(func):
def start(*args,**kwargs):
cr = func(*args,**kwargs)
cr.next()
return cr
return start
@coroutine
def grep(pattern):
print "Looking for %s" % pattern
try:
while True:
line = (yield)
if pattern in line:
print line,
except GeneratorExit:
print "Going away. Goodbye"
最佳答案
如果您想要的是一个“可观察的集合”——也就是说,一个将结果推送给您而不是让消费者拉取它们的集合——那么您可能想要研究 Reactive Framework 扩展。这是一篇关于它的文章:
http://www.infoq.com/news/2009/07/Reactive-Framework-LINQ-Events
现在,正如您所注意到的,如果您有可用的协程,则可以轻松构建“推”和“拉”式迭代器。 (或者,正如 Thomas 指出的那样,您也可以使用延续来构建它们。)在当前版本的 C# 中,我们没有真正的协程(或延续)。然而,我们非常关心用户对异步编程的感受。
将基于纤程的协同程序作为一流的语言特性来实现是一种可能用于简化异步编程的技术,但这只是我们目前正在研究的许多想法中的一种。如果您有一个非常可靠的场景,其中协程比其他任何东西(包括响应式(Reactive)框架)都做得更好,那么我很乐意听到更多关于它的信息。我们掌握的关于人们在异步编程中面临的实际问题的真实数据越多,我们就越有可能想出一个好的解决方案。谢谢!
更新:我们最近宣布,我们将在下一版本的 C# 和 VB 中添加类似协程的异步控制流。您可以使用我们的社区技术预览版自行尝试,您可以下载 here .
关于c# - 如何使用 C# 执行协程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2493294/