纤维与异步等待

时间:2015-07-04 13:34:15

标签: c# multithreading asynchronous async-await fibers

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

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

PS:我们正在使用.Net 4.5

1 个答案:

答案 0 :(得分:16)

  

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

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

为了使用光纤,必须调用非托管API,因为.NET没有在BCL中提供任何托管包装。 Even the docs of fibers clearly say there isn't a clear advantage to using them

  

通常,纤维不具备优于精心设计的优势   多线程应用程序。但是,使用光纤可以更容易   设计用于安排自己的线程的端口应用程序。

  

我想知道使用的优点和缺点是什么   光纤与使用新的异步等待并使用线程。

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

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