我有一些需要“启动并忘记”的代码,意思是调用代码不需要等待响应。如果我在一秒钟内迭代循环并调用此代码10,000次,那么会有10,000个线程飘荡在周围,争夺资源吗?我担心我的计算机会瞬间变得非常缓慢。或者,线程池是否管理这些请求并将它们排队等待解决?换句话说,使用Task.Run()做一些愚蠢的事情有多容易。
Task.Run
时,它会创建一个新的 Task
并在TaskScheduler.Default
上安排它。这恰好是 ThreadPoolTaskScheduler
,然后将该任务排队到 ThreadPool
。 ThreadPool
使用线程池(出奇地)缓慢处理工作项。 ThreadPool
在内部管理自己的线程,并在需要时可以创建更多。不,我会有10,000个浮动的线程,争夺资源吗?
ThreadPool
通常知道如何有效地管理其线程,并且增长非常缓慢。Task.Factory.StartNew
并传递TaskCreationOptions.LongRunning
,则会创建10,000个后台线程。