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