纤维与异步等待

Ali*_*ori 13 c# multithreading asynchronous fibers async-await

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

我想知道使用Fibers vs使用new async await和使用Threads有什么优缺点.

PS:我们正在使用.Net 4.5

Yuv*_*kov 17

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

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

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

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


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

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

我认为你应该告诉你的主开发人员async-await分别使用Task Parallel Library和多线程和异步IO工作进行一些阅读.我想这会让你们所有人的生活更轻松.

  • +1一个额外的注释:`他知道特定函数来自哪个线程,甚至可以访问堆栈中更高的变量. - 我将其解释为意味着光纤在恢复时保留其调用堆栈,而异步方法则不然.我认为整体async/await/TPL更容易使用和推理,但我可以看到针对它们的调用堆栈调试参数. (4认同)