c# - 如何使用 C# 执行协程?

标签 c# python system.reactive coroutine

在 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/

相关文章:

C# ShowDialog 调用另一个 ShowDialog

python使用lambda使用foldleft计算间隔

c# - IObservable<T>.ToTask<T> 方法返回等待激活的任务

c# - 如何将 Observables 序列化到云端并返回

c# - 从 DLL 调用函数?

c# - 同一句话在luis模型和团队上的不同意图,如何解决?

python - 如何在逻辑上组合numpy中的整数索引?

windows-8 - 我如何利用 Microsoft Rx 框架在 WinRT/Windows 8 中有效地实现 Bing Map

c# - 如何通过 C# 单击 selenium webdriver 中的 DOM 元素

Python 在当前目录中查找扩展名类型,对其进行计数并查找每种扩展名类型的最小、平均和最大文件大小