问题 纤维与异步等待


我正在加入一个开发人员大量使用的C#项目 纤维。在这个项目之前,我甚至没有听说过它们以前使用过 async await 和 Threads 和 BackgroundWorker我的多任务操作。今天我问他们为什么用 Fibers和主要开发人员说,他更容易调试。这意味着他知道特定函数来自哪个线程,甚至可以访问堆栈中更高的变量。

我想知道使用的优点和缺点是什么 Fibers vs使用新的 async await 和使用 Thread秒。

PS:我们正在使用.Net 4.5


3171
2017-07-04 13:34


起源

你指的是什么光纤实现的使用?该 Windows Fiber API? - timmyl
确实,当您暂停调试器时,您无法看到应用程序的功能,因为所有线程在大多数情况下都不执行任何操作。这是异步IO的一大缺点。不过,我绝不会推荐纤维。 - usr
纤维比任务更昂贵。光纤需要1MB内存。任务需要内存用于本地变量,但它们使用调度程序的堆栈。 - Raymond Chen
@timmyl抱歉回答迟到了。它是使用Enumarables手动实现的 - Alireza Noori
在这种情况下,由于它不是OS级别的Fibers,我可以想到的一个案例是严格的内存占用约束,因此您希望您的应用程序在一个线程+正常的CLR基础架构线程上运行。与调查员合作多任务是实现这一目标的一种方法。这说了很多工作。我认为你需要一个强有力的理由去CLR线程池和异步I / O非常强大。可能有助于提供有关您正在处理的系统类型以及它具有的任何特殊约束的更多上下文。 - timmyl


答案:


我问他们为什么他们使用Fibers而主要的开发者说   他调试起来比较容易。意思是他知道哪个线程了   特定功能来自甚至可以访问变量   堆栈中更高。

这听起来完全是奇特的。将任务并行库与默认情况下的自定义调度程序一起使用时 ThreadPoolTaskScheduler,您可以自己决定如何安排任务(并且不一定在新线程上)。 async-await 另一方面,为您提供了一种执行异步IO的便捷方式。 VS使您能够使用同步执行的方式调试异步代码。

为了使用光纤,必须调用非托管API,因为.NET不在BCL中提供任何托管包装。 甚至纤维的文件都明确表示使用它们没有明显的优势

一般来说, 纤维不能提供优于精心设计的优点   多线程应用程序。 但是,使用纤维可以更容易   设计用于调度自己的线程的端口应用程序。


我想知道使用的优点和缺点是什么   Fibers vs使用新的异步等待并使用Threads。

运用 async-await 为您提供IO绑定异步工作的好处,同时感觉您正在同步执行。任务并行库提供了一种简单的方法来调度专用线程的工作,无论是线程池线程还是新线程,同时允许您连接到调度这些工作单元的机制。我认为今天使用光纤没有任何优势,所有框架都必须提供。

我想你应该告诉你的主要开发人员使用任务并行库和任务并行库来阅读多线程和异步IO工作 async-await, 分别。我想这会让你们所有人的生活更轻松。


15
2017-07-04 13:44



谢谢你的解释。对此,我真的非常感激。我认为光纤最大的问题之一是你提到的缺乏.Net支持。 - Alireza Noori
+1另外一个注意事项: he knows which thread a particular function has come from and even could access the variables higher in the stack.  - 我将此解释为意味着光纤在恢复时保留其调用堆栈,而异步方法则不然。我认为整体async / await / TPL更容易使用和推理,但我可以看到针对它们的调用堆栈调试参数。 - Stephen Cleary