纤维与异步等待

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

我想知道使用Fiber s与使用新的async await和使用Thread的优点和缺点是什么。

PS:我们正在使用.Net 4.5

我问他们为什么他们使用Fibers,主要的开发人员说他更容易调试。 这意味着他知道特定函数来自哪个线程,甚至可以访问堆栈中更高的变量。

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

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

通常, 与精心设计的multithreading应用相比光纤不具有优势。 但是,使用光纤可以更容易地移植旨在调度自己的线程的应用程序。


我想知道使用Fibers与使用新的异步等待和使用线程有什么优缺点。

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

我想你应该告诉你的主开发人员分别使用Task Parallel Library和async-await来阅读multithreading和异步IO工作。 我想这会让你们所有人的生活更轻松。