【发布时间】:2013-04-21 18:07:37
【问题描述】:
是否可以在与调用者相同的线程中异步定义和调用方法? 假设我只有一个内核,并且不希望有 100 个线程的线程管理开销。
编辑 我问的原因是 nodejs 做事模型 - 一个线程上的所有东西都不会阻塞任何东西,这被证明是非常有效的,这让我想知道在 C# 中是否可以实现相同的东西(我自己无法实现)。
Edit2 好吧,正如 cmets 中所述,节点毕竟不是单线程的(但是简单的负载测试表明,它只使用一个核心......),但我认为是什么让它如此高效是只编写非阻塞代码的隐含要求。这在 C# 中是可能的,除非不是必需的:) 无论如何,谢谢大家...
更多信息在 this SO post 甚至更多 this one
【问题讨论】:
-
@MattBall:假设异步操作不受 CPU 限制。假设异步操作是等待三十秒,然后重置按钮的颜色。为什么要启动另一个线程?
-
@ren:也就是说,Matt Ball 说得有道理。有问题的操作是否需要在另一个线程上运行取决于该操作的实现者。如果要限制创建的线程数,那就是线程池的用途。如果您生成一个异步任务,TPL 将负责从池中调度正确数量的线程以使内核饱和。与其让我们继续猜测您在做什么,不如您就您遇到的实际问题提出问题,而不是提出解决方案。
-
如果您的问题是“我可以编写一个程序,其中每个操作都是异步的并且每个操作都在同一个线程上吗?”那么答案是肯定的,当然你可以这样做。如果 you 是编写异步操作的人,那么 you 决定它继续执行哪个线程。如果您的问题是“我有一个使用线程池线程的 ComputeFractalAsync 方法,我希望它在当前线程上运行”,那么请致电编写该方法的人并要求他们为您编写一个不使用的版本线程池。
-
nodejs 并不完全是单线程的。 js实际上是同步到事件函数中的,所以你看不到多线程。另请阅读Is NodeJS really Single-Threaded? 和Node is Not Single Threaded。
-
如果您希望所有调用都在同一个线程上并且您正在编写所有代码,那么永远不要创建新线程。就这么简单。
标签: c# multithreading asynchronous