"ThreadPool中没有足够的空闲线程来完成操作."

Arr*_*abi 3 .net c# multithreading exception threadpool

使用多个线程下载时,我收到以下错误消息:

ThreadPool中没有足够的空闲线程来完成操作.

我应该尝试更改.net中线程池的默认设置,我该怎么办?

Mar*_*ell 9

改变大小ThreadPool几乎肯定是一个坏主意(尤其是:每个线程将占用另一块堆栈空间); 你应该看看你的线程用法 - 你是否在游泳池中饱和?您可能会发现TPL和Task[<T>]处理某些异步代码的更好方法,或者在诸如IO之类的情况下 - Begin*/ End*async操作而不是ThreadPool线程上的同步操作.

您还可以检查所有异步操作是否完全存在; 他们可能会拖延(也许是僵局)并且不会退出?

最后:将ThreadPool主要用于简单操作(其中的旋转加速成本Thread是最明显); 长期运行的操作可能会在专用Threads上做得更好


Tal*_*lon 5

尽管这并不能直接回答问题,但它可能会帮助某人避免此问题。您可以使用下面的命令查看有多少线程可用,并确保不超过它。

int workerThreads, cmpThreads;
ThreadPool.GetAvailableThreads(out workerThreads, out cmpThreads);
Run Code Online (Sandbox Code Playgroud)

这将为您提供最大可用线程数。

有关不同类型线程的描述,请查看以下解释:

.NET 中工作线程和 I/O 线程的简单描述