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

Jer*_*Gee 8 c# yield coroutine fiber

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

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

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

有人用过吗?

jpb*_*chi 8

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

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


小智 7

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

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