我注意到,如果我的 IO 密集型应用程序的 ThreadPool 最大线程数设置得太低 (16),那么我的 GUI 将冻结。但是如果我将它设置得更高(250),它就可以了。
谁能解释这种现象?
我注意到,如果我的 IO 密集型应用程序的 ThreadPool 最大线程数设置得太低 (16),那么我的 GUI 将冻结。但是如果我将它设置得更高(250),它就可以了。
谁能解释这种现象?
哇!除非您知道自己在做什么,否则不要弄乱 ThreadPool 计数 - 许多基本的 .NET 服务可能正在使用它,并且依赖它不会饱和。您几乎可以肯定通过饱和使一些基本 IO 代码陷入僵局。
我想在这种特殊情况下是 IO 完成端口让你绊倒......
Joe Duffy(他比我更了解线程)在这里对此有一些想法。
重新如何通过饱和来死锁——这在思想实验中很容易重现;假设你有一些工作代码需要做 2 件事……我们将其中 1 件推送到 ThreadPool 上,然后自己做一件;在完成我们自己的工作之后,我们将 Join() [或等效的 ThreadPool] 第二个任务,以便我们知道两者都已完成。
现在想象我们在最后一个可用的 ThreadPool 线程上启动这个工作代码:我们做我们自己的工作,然后等待第二个任务已经完成的信号——但是没有可用的线程来做它!我们不能释放我们自己的,因为我们还在等待。
您可以对 IO 完成端口执行相同操作。