【发布时间】:2015-09-22 03:29:39
【问题描述】:
我正在加入一个 C# 项目,其中开发人员大量使用 Fibers。在这个项目之前,我什至没有听说过它们,并且以前在我的多任务操作中使用过 async await 和 Threads 和 BackgroundWorkers。今天我问他们为什么使用Fibers,主要开发人员说他更容易调试。这意味着他知道特定函数来自哪个线程,甚至可以访问堆栈中更高的变量。
我想知道使用Fibers 与使用新的async await 和使用Threads 的优缺点是什么。
PS:我们使用的是 .Net 4.5
【问题讨论】:
-
你指的使用什么Fiber实现? Windows Fiber API?
-
确实,当您暂停调试器时,您看不到应用程序在做什么,因为所有线程大部分时间都没有做任何事情。这是异步 IO 的一大缺点。不过,我绝不会推荐纤维。
-
光纤比任务更昂贵。光纤需要 1MB 的内存用于堆栈。任务需要内存用于局部变量,但它们使用调度程序的堆栈。
-
@timmyl 抱歉回复晚了。它是使用 Enumarables 手动实现的
-
在那种情况下,由于它不是操作系统级别的光纤,我能想到的一种情况是严格的内存占用限制,因此您希望您的应用程序在一个线程 + 普通 CLR 基础架构线程上运行。与枚举器合作的多任务处理是实现这一目标的一种方法。那说它的工作量很大。我认为你需要一个强有力的理由来走这条路,因为 CLR 线程池和异步 I/O 非常强大。提供有关您正在处理的系统类型及其具有的任何特殊限制的更多背景信息可能会有所帮助。
标签: c# multithreading asynchronous async-await fibers