17

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

Fiber我想知道使用s 与使用 newasync await和 using s 的优缺点是什么Thread

PS:我们使用的是 .Net 4.5

4

1 回答 1

18

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

这听起来很奇怪。将 Task Parallel Library 与 default 以外的自定义调度程序一起使用时ThreadPoolTaskScheduler,您可以自己决定如何调度您的任务(并且不一定在新线程上)。async-await另一方面,为您提供了一种方便的方式来进行异步 IO。VS 使您能够像同步执行一样调试异步代码。

为了使用纤程,必须调用非托管 API,因为 .NET 在 BCL 中不提供任何托管包装器。即使是纤维文档也清楚地表明使用它们没有明显的优势

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


我想知道使用 Fibers 与使用新的 async await 和使用 Threads 的优缺点是什么。

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

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

于 2015-07-04T13:44:04.877 回答