在
python中,yield关键字可以在push和pull两个上下文中使用,我知道如何在c#中执行pull context,但是如何实现push.我发布的代码,我试图复制在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"
解决方法
如果你想要的是一个“可观察的集合” – 也就是说,一个将结果推送给你的集合,而不是让消费者拉他们 – 那么你可能想查看反动框架扩展.这里有一篇文章:
http://www.infoq.com/news/2009/07/Reactive-Framework-LINQ-Events
现在,您可以注意到,如果您有协同程序可用,您可以轻松构建“推”和“拉”式迭代器. (或者,正如托马斯指出的那样,您可以使用延续来构建它们.)在当前版本的C#中,我们没有真正的协程(或延续).然而,我们非常关心用户对异步编程的感觉.
实现基于光纤的协同程序作为一流的语言特性是一种可能用于使异步编程更容易的技术,但这只是我们目前研究的许多可能的想法.如果你有一个非常坚实的场景,其中协调工作比其他任何事情都更好 – 包括反应式框架 – 那么我很乐意听到更多的信息.关于人们在异步编程中面临的真正问题,我们有更实际的数据,我们越有可能想出一个很好的解决方案.谢谢!
更新:我们最近宣布,我们正在向下一个版本的C#和VB添加协同程序类异步控制流.您可以使用我们的社区技术预览版,您可以下载here.