我注意到,如果我的IO密集型应用程序的ThreadPool最大线程数设置得太低(16),那么我的GUI将会冻结。但如果我把它设置得相当高(250),它就可以正常工作。
任何人都可以解释这种现象吗?
答案 0 :(得分:3)
我想在这种特殊情况下,正是IO完成端口绊倒你......
Joe Duffy(谁比我以前更了解线程)对此here有一些想法。
如何通过饱和来使其死锁 - 这在思想实验中很容易重现;假设你有一些工作代码需要做两件事...我们将其中一个推入ThreadPool,并自己做一个;在完成我们自己的工作后,我们将加入()[或ThreadPool等效]第二个任务,以便我们知道它们都已完成。
现在想象一下,我们在最后一个可用的ThreadPool线程上启动这个工作代码:我们自己完成工作,然后等待第二个任务完成的信号 - 但是没有线程可用来执行它!我们不能释放自己的,因为我们还在等待。
您可以对IO完成端口执行相同的操作。