C#中的纤维:它们比迭代器更快,并且让人们使用它们?

所以我正在和一位同事聊聊有关光纤的问题,并在2003年发表了这篇论文 ,描述了使用Fiber API在C#中实现协同程序。

本文中Yield的实现是针对.NET 1.1的,因此它早于.NET 2.0中出现的yield return语法。

乍一看,它确实看起来这里的实现可能更快,并且可以很好地扩展到多个CPU。

有人用过吗?

我没有用它,但我对这个问题很感兴趣。 以下是使用循环调度程序在C#中执行协同程序的一个很好的实现: http : //www.bluebytesoftware.com/blog/PermaLink.aspx? guid = 71235c5a-375-4bab-bdb0-334ab439afaf

顺便说一句,引用维基百科 ,“纤维描述与协同程序基本相同的概念”。 据我所知,C#中与协程(或光纤)最接近的是迭代器。 实际上,它们非常接近协同程序。 Lippert发布了几个关于迭代器的消息。 希望它们都不代表您需要的严重问题。

我使用了基于产量的“协同程序”,我不得不说它们是一个痛苦的屁股。 当然,问题在于您想要使用它们的任何地方,您都被迫使用yield语法。 不仅如此,除非你链接产量(父母产生孩子的产量),你只能将你的协同程序嵌套一层。 这完全破坏了协程的一个主要好处(全栈保存/恢复)。

我在C#中实现了一个基于光纤的协程系统,它运行得非常好直到我遇到exception。 不幸的是.Net运行时在OS线程中存储了一堆内部exception内容,这意味着使用OS光纤(和p / invoke)模拟多个线程只是不起作用,除非你永远不会有exception。

Coroutines,乍一看引起了我的注意……几天前我正在寻找并行AsyncWCF方法调用的工作流解决方案,我发现的确非常吸引人:

http://csharperimage.jeremylikness.com/2010/03/sequential-asynchronous-workflows-in.html

本文展示了如何使用协同程序在Silverlight应用程序中创建/管理使用异步模式消耗WCF的工作流。

我不知道它对迭代器的速度,但对我来说它就像一个高级forms的子程序,在任务关键任务中非常有用,正常的子程序不能为你提供并行执行任务的奢侈。