我注意到,即使當我放置更多線程時,我的多線程應用程序也幾乎沒有獲得60%的處理使用率。我檢查代碼並最終發現,可能對DLL(Html Agility Pack)的調用不是非同步執行的。有沒有辦法讓電話並行?如何創建一個必須調用每次阻塞的DLL的多線程應用程序被稱爲
回答
第一個問題是,你如何管理線程?我通過使用託管的ThreadPools提供了很好的體驗。系統自己管理資源。
Sewcond我建議你使用委託調用方法或DLL線程和異步。關於threadpooling有一個很好的MSDN文章: http://msdn.microsoft.com/en-us/library/3dasc8as%28v=vs.80%29.aspx
在這裏你可以找到一些不錯的ressource文章吧: http://support.microsoft.com/kb/315582/en-us
請反饋一些代碼示例,如果這沒有解決您的問題。
問題不在於線程。問題在於調用引用的dll的函數。他們被從不同的線程調用,但最終他們以某種方式被編組並被同步調用。 – Devela 2012-04-27 16:29:21
@Devela這不是答案。我寫在這裏,因爲評論有點長。
我不認爲你的問題與STA有關。只需在代碼下面嘗試。
Action action =() =>
{
string html = "<html><body><div>1111</div><div>222</div></body></html>";
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);
var x = doc.DocumentNode.Descendants("div").ToArray();
var y = x[0].InnerText;
};
while(true)
{
Parallel.For(0,32,i=>action());
}
此代碼使我的CPU保持在96%的忙碌狀態。我的猜測是你的線程正在被一些磁盤IO,網絡操作等阻塞,因此儘管你添加了更多的線程,但你看不到多少CPU使用率。
是的,其實你是對的!在每個線程上加載一個文件,然後加載到HtmlAgilityPack中。然後所有的線程寫入一個文件,在那裏存儲所有線程的解析結果。這是我的處理器不使用40%最大處理能力的原因嗎?我有一個i7。順便說一句,我試圖消除寫操作(對單個文件),它似乎沒有更好。所以從光盤加載文件時應該是這個問題?這是我一個接一個做的事情,每當我加載一個我創建一個新線程並將該文件作爲參數發送時。 – Devela 2012-04-28 04:18:04
- 1. 當被Delphi對象調用時,一個DLL是否必須是多線程的?
- 2. Flask應用程序在多線程中被阻塞
- 3. 使用隊列的Python多線程 - 程序永遠被阻塞
- 4. java多線程應用程序:正在線程阻塞時間
- 5. 進程阻塞如何應用於多線程進程?
- 6. Neo4J「GC Monitor:應用程序線程被阻塞10000ms」
- 7. 在另一個線程中調用Thread.sleep()時UI線程被阻塞
- 8. 多個定時器WPF應用程序,調用線程必須是STA錯誤
- 9. 在MVC 2應用程序創建一個非阻塞的過程
- 10. 如何避免多線程程序因線程等待而被阻塞
- 11. 使用多線程將程序轉變爲使用阻塞隊列的程序
- 12. 爲什麼線程被多次創建?
- 13. 阻塞線程的調用方法
- 14. OpenMP阻塞線程中的調用
- 15. java.util.Calendar.get *和java.util.Calendar.set *在多線程應用程序中阻塞
- 16. 在多線程應用程序中同步阻塞
- 17. 您必須創建一個應用程序
- 18. UI線程被阻塞
- 19. Netty線程被阻塞
- 20. 線程只阻塞第一個線程
- 21. 的Web應用程序中使用了Javassist阻塞線程
- 22. curl_multi_exec必須被調用多少次?
- 23. Tomcat沒有響應,threadump顯示一個被阻塞的線程
- 24. Delegate.BeginInvoke回調阻塞調用線程?
- 25. 將線程阻塞轉換爲f中的非線程阻塞#
- 26. Java Web應用程序:高堆使用和被阻塞的線程 - 同時
- 27. 如何在VB6應用程序中調用.NET創建的DLL?
- 28. 如何使用wpf調度程序創建多UI線程winforms應用程序
- 29. 爲什麼我的應用程序被阻塞
- 30. 爲什麼啓動一個線程被另一個線程阻塞?
像產卵一個新的線程和調用阻塞方法? – 2012-04-26 21:23:53
顯示請您如何調用dll – Likurg 2012-04-26 21:23:57
@Likurg我基本上在每個線程上創建一個不同的文檔,然後加載一個html文檔,然後我做幾個xpath查詢。 – Devela 2012-04-26 21:25:43