纤程与异步等待

Fibers vs async await

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

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

PS:我们正在使用 .Net 4.5

I was asking them why they used Fibers and the main developer said that it's easier for him to debug. Meaning he knows which thread a particular function has come from and even could access the variables higher in the stack.

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

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

In general, fibers do not provide advantages over a well-designed multithreaded application. However, using fibers can make it easier to port applications that were designed to schedule their own threads.


I was wondering what are the advantages and disadvantages of using Fibers vs using the new async await and using Threads.

使用 async-await 可以让您在进行 IO 绑定异步工作的同时感觉自己正在同步执行。 Task Parallel Library 提供了一种在专用线程上调度工作的简单方法,无论是线程池线程还是新线程,同时允许您挂钩调度这些工作单元的机制。我真的看不出今天使用纤程有什么好处,因为框架必须提供所有功能。

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