【问题标题】:Is there a fiber api in .net?.net 中有光纤 api 吗?
【发布时间】:2010-12-29 06:36:08
【问题描述】:

出于好奇,我一直在寻找一组 C#/.net 类来支持纤程/协同例程 (the win32 version),但没有任何运气。

有人知道这样的野兽吗?

【问题讨论】:

    标签: c# .net fiber


    【解决方案1】:

    如果我没记错的话,.NET 2 beta 中有一个,但它被删除了。 Eric Lippert 撰写了有关纤维和延续的文章,并表示他们选择了必要的最小 (link)。

    有很多方法可以使用迭代器和yield来制作协程系统,请参阅this link。还有来自 Joe Duffy 的 another one

    【讨论】:

    • 有趣的是,我正在使用链接的 MSDN 文章(上图)中的代码并收到此警告(.net 4 beta):警告 CS0618: 'System.AppDomain.GetCurrentThreadId()' is obsolete : 'AppDomain.GetCurrentThreadId 已被弃用,因为当托管线程在纤程(又名轻量级线程)上运行时,它不提供稳定的 Id。要获取托管线程的稳定标识符,请使用 Thread 上的 ManagedThreadId 属性。 go.microsoft.com/fwlink/?linkid=14202'“又名轻量级线程”很有趣。
    • 这意味着如果您希望 Fibers 作为轻量级线程,那么 Fx 已经在做,Fx4 会做得更多。
    • 我不确定我是这样理解的。鉴于 Lippert 的链接文章,这看起来像是内置纤维支架的残留物,因此被移除。 (这条消息来自 Fx4 顺便说一句)。
    • 我的意思是这个(上面链接)讨论了框架中对纤维的支持。另外需要说明的是,最初的 msdn 作者必须与运行时相关的东西对于 4.0 运行时似乎不是必需的,这让我相信他们所做的一些支持仍然完好无损。 blogs.msdn.com/ericlippert/archive/2009/07/09/…
    【解决方案2】:

    你见过吗:

    标题“通过包装非托管 Fiber API 为 .NET 实现协程”
    在 2003 年 9 月号的 MSDN 杂志上

    http://msdn.microsoft.com/en-us/magazine/cc164086.aspx

    【讨论】:

    • 我没有,但快速浏览一下看起来很有趣。
    • 有趣的文章,如果已经过时了(使用 VS 2003 风格的托管 C++)。
    • 请注意顶部的大红色警告:请勿使用。
    • 我也喜欢提到与 Cor Runtime 交互的未记录方法
    • 链接无效,它只是链接到杂志的集合。
    【解决方案3】:

    没有。框架中没有 Fiber API。我怀疑这是因为使用它们没有什么优势——甚至fiber API page(本地)提到:

    一般而言,与精心设计的多线程应用程序相比,纤程没有优势。

    .NET 让开发“精心设计”的多线程应用程序变得非常容易,我怀疑 Fiber API 几乎没有用处。

    【讨论】:

    • 实际上,纤程可以用来实现相对便宜的协程(参见:en.wikipedia.org/wiki/Coroutineen.wikipedia.org/wiki/Fiber_%28computer_science%29)。在 c# 原生支持协程作为一种语言特性之前,纤程可能是实现这一目标的下一个最简单的方法。
    • 你可以在 C# 中使用生成器来实现这一点:en.wikipedia.org/wiki/Coroutine#Coroutines_and_generators
    • 将生成器与 Rx 和 TPL 等一些新事物混合在一起,我认为您现在很难在 C# 中找到对纤维的良好使用...
    • @ReedCopsey 问题在于这些协程是无堆栈的,而基于光纤的协程是有堆栈的。
    • @rightfold 与“无堆栈”协程相比,“堆叠式”协程有哪些优势?
    猜你喜欢
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    • 2018-10-10
    • 2013-11-13
    • 2016-10-25
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多