ThreadPool导致GUI冻结(?)

时间:2008-11-05 21:55:30

标签: c# .net threadpool

我注意到,如果我的IO密集型应用程序的ThreadPool最大线程数设置得太低(16),那么我的GUI将会冻结。但如果我把它设置得相当高(250),它就可以正常工作。

任何人都可以解释这种现象吗?

1 个答案:

答案 0 :(得分:3)

哇哦!除非你知道自己在做什么,否则不要乱用ThreadPool计数 - 很多基本的.NET服务可能正在使用它,并且依赖它不会饱和。你几乎肯定会通过饱和来使一些基本的IO代码陷入僵局。

我想在这种特殊情况下,正是IO完成端口绊倒你......

Joe Duffy(谁比我以前更了解线程)对此here有一些想法。

如何通过饱和来使其死锁 - 这在思想实验中很容易重现;假设你有一些工作代码需要做两件事...我们将其中一个推入ThreadPool,并自己做一个;在完成我们自己的工作后,我们将加入()[或ThreadPool等效]第二个任务,以便我们知道它们都已完成。

现在想象一下,我们在最后一个可用的ThreadPool线程上启动这个工作代码:我们自己完成工作,然后等待第二个任务完成的信号 - 但是没有线程可用来执行它!我们不能释放自己的,因为我们还在等待。

您可以对IO完成端口执行相同的操作。