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

时间:2009-12-10 14:52:17

标签: c# yield coroutine fiber

所以我正在和一位同事聊聊fibers,然后出现了this paper from 2003,它描述了使用Fiber API在C#中实现协同程序。

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

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

有人用过吗?

3 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:1)

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

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

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

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