在 python 中,yield 关键字可以在推送和拉取上下文中使用,我知道如何在 c# 中执行拉取上下文,但是我将如何实现推送。我发布了我试图从 python 在 c# 中复制的代码:

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 /无功-框架-LINQ-活动

现在,当你注意,你可以很容易地建立既“推”和“拉”风格的迭代器,如果您有可用的协同程序。 (或者,正如托马斯指出,你可以用延续建造它们。)在C#的当前版本我们没有真正的协同程序(或延续)。但是,我们非常关注的痛苦用户感到周围的异步编程

基于光纤实现协同程序作为第一级的语言特性是一个技术,它可能被用来使异步编程更加容易,但是这是许多的只是一个可能的想法,我们正处于研发存在。如果你有一个非常坚实的真棒场景协同程序做一个更好的工作比什么都重要 - 包括反应框架 - 那么我想听到更多。我们有什么实际问题的人面临的异步编程更现实的数据,就越有可能我们要拿出一个好的解决方案。谢谢!

更新:我们最近宣布,我们正在增加协程样异步控制流向的C#和VB的下一个版本。你可以自己尝试一下我们的社区技术预览版,你可以在这里下载

其他提示

C#不具有一般协同例程。一般协同例程是在协同例程都有自己的堆栈,即,它可以调用其他方法和这些方法可以“产量”的值。一般协程的实现需要用栈做一些聪明事,可能直至并包括分配堆栈帧上堆(包含局部变量隐藏结构)。这是可以做到,有些语言做(例如计划),但它是有点棘手做是正确的。此外,许多程序员发现很难的功能理解。

一般协同例程可以有螺纹仿真。每个线程都有自己的堆栈。在协同例程的设置,两个线程(初始呼叫者,而线程的协同例程)将交替控制,它们将实际上从未同时运行。的“产量”的机制是,则两个线程之间的交换,因此它是昂贵的(同步,通过OS内核和调度...往返)。此外,还有很大的空间内存泄漏(协同例程必须明确“停止”,否则等待的线程将永远坚持)。因此,这种情况很少进行。

C#提供称为bastardized向下协同例程特征迭代。 C#编译器会自动将迭代器代码转换成特定状态类,与局部变量成为类的字段。屈服然后,在虚拟机级,普通return。只要“产量”是从迭代代码本身执行,而不是从该迭代器代码调用的方法这样的事情是可行的。 C#迭代器已经涵盖许多用例和C#的设计师们不愿进一步往下走的道路延续 。有些讽刺的人热衷于状态实现全功能的延续会阻止C#被作为有效作为其头号敌人的Java(高效的延续是可行的,但这需要与GC和JIT编译器颇有些工作)。

感谢@NickLarsen,你帮我记住新的东西,MS已经出台,的IObservable接口。

链接 http://msdn.microsoft.com /en-us/library/dd783449(VS.100).aspx

其实.NET不会使“不正确的假设”关于线程关联,事实上它完全解耦OS级线程.NET级线程的概念。

你所要做的就是用你的纤维逻辑.NET线程状态相关联(对于你所需要的CLR托管API的,但你并不需要自己编写一台主机就可以使用那些从自己的应用程序直接需要)和一切,锁定跟踪,异常处理再正常工作。

一个例子可以在这里找到: http://msdn.microsoft。 COM / EN-US /杂志/ cc164086.aspx

顺便说一下单声道2.6含有低级别协程支持,并可以用来容易地实现所有较高级别的原语。

我喜欢看到对于.NET基于光纤的API。

我试图通过P /使用原生纤维API在C#中调用而回,但由于运行时的异常处理(错误地),使基于线程的假设,事情爆发(严重),当异常发生。

一个“杀手锏”为基于光纤的协程API是游戏编程;某些类型的AI需要一个“轻量级”的主题,你可以时间片随意。例如,游戏中的行为树木要求每帧的能力,“脉冲”的决定代码,使AI代码协同产量返回给调用者的决定时切片了。这是可能的用硬的线程来实现,但更多,更多复杂的。

因此,虽然真正的纤维用例是不是主流,他们肯定是有的,如果在光纤子系统存在的错误是制定了我们的.Net程序员的一个小众会强烈地欢呼。

好了,我给一个尝试开发一个完整的库只有一个线程来管理协同程序。困难的部分是调用内部的协同程序协同程序......并返回参数,但最后我达到了一个相当不错的结果的此处。唯一的警告是阻塞I / O操作必须通过做任务和alll“回归”必须以“回报收益率”来代替。 基于此库我能够用标准异步提出的要求近一倍的应用服务器/伺机基于IIS。 (寻求Node.Cs和Node.Cs.Musicstore在github尝试在家里)

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