2008-11-05 128 views
0

我注意到,如果我的IO密集型應用程序的ThreadPool max線程數設置得太低(16),那麼我的GUI將凍結。但是如果我把它設置得相當高(250),它就可以工作。ThreadPool導致GUI凍結(?)

任何人都可以解釋這種現象嗎?

回答

3

哇!除非知道自己在做什麼,否則不要惹惱ThreadPool計數 - 許多重要的.NET服務可能正在使用它,並且依賴於它不飽和。你幾乎可以肯定通過飽和將一些基本的IO代碼解鎖了。

我會想象它是被絆倒了,你在這個特殊的情況下,IO完成端口...

喬·達菲(誰比我會知道更多關於線程)對這個here的一些想法。

重新如何通過飽和使其死鎖 - 這在思維實驗中很容易重現;假設你有一些需要做2件事的工作者代碼......我們將其中的1件推到ThreadPool上,並自己做一件事;在完成我們自己的工作後,我們將Join()[或ThreadPool等價物]第二個任務,以便我們知道兩者都已完成。

現在想象一下,我們在最後一個可用的ThreadPool線程上啓動這個工作者代碼:我們自己做了工作,然後等待第二個任務已完成的信號 - 但是沒有可用的線程來完成它!因爲我們還在等待,所以我們無法釋放我們自己的。

您可以對IO完成端口執行相同的操作。

+0

但爲什麼這會搶佔GUI線程,這大概不是從ThreadPool分配的? – Chris 2008-11-05 22:03:56