8

因此,我与一位同事讨论了有关Fiber的问题,并从 2003 年开始阅读这篇论文,该论文描述了使用 Fiber API 在 C# 中实现协程。

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

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

有人用过吗?

4

3 回答 3

8

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

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

于 2009-12-14T16:28:21.573 回答
7

I have used yield-based "coroutines," and I have to say that they are a pain in the butt. The problem is, of course, that everywhere you want to use them, you're forced to use the yield syntax. Not only that, but unless you chain yields (parent yields child's yield), you can only ever nest your coroutines one level deep. This completely destroys one of the key benefits of coroutines (full stack save/restore).

I implemented a fiber-based coroutine system in C# and it worked wonderfully UNTIL I hit an exception. Unfortunately the .Net runtime stores a bunch of internal exception stuff in OS threads, which means that emulating multiple threads using OS fibers (and p/invoke) just won't work unless you'll never, ever, ever have an exception.

于 2010-04-27T15:25:12.200 回答
2

协程,乍一看就引起了我的注意.. 几天前,我正在寻找并行 AsyncWCF 方法调用的工作流解决方案,我发现这真的很吸引人:

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

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

我不知道它对迭代器的速度,但对我来说,它就像一种高级形式的子例程,在普通子例程无法为您提供并行执行任务的任务关键任务中非常有用。

于 2010-04-27T15:34:25.253 回答