2012-04-26 28 views
0

我注意到,即使當我放置更多線程時,我的多線程應用程序也幾乎沒有獲得60%的處理使用率。我檢查代碼並最終發現,可能對DLL(Html Agility Pack)的調用不是非同步執行的。有沒有辦法讓電話並行?如何創建一個必須調用每次阻塞的DLL的多線程應用程序被稱爲

+0

像產卵一個新的線程和調用阻塞方法? – 2012-04-26 21:23:53

+0

顯示請您如何調用dll – Likurg 2012-04-26 21:23:57

+0

@Likurg我基本上在每個線程上創建一個不同的文檔,然後加載一個html文檔,然後我做幾個xpath查詢。 – Devela 2012-04-26 21:25:43

回答

0

第一個問題是,你如何管理線程?我通過使用託管的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

請反饋一些代碼示例,如果這沒有解決您的問題。

+0

問題不在於線程。問題在於調用引用的dll的函數。他們被從不同的線程調用,但最終他們以某種方式被編組並被同步調用。 – Devela 2012-04-27 16:29:21

0

@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使用率。

+0

是的,其實你是對的!在每個線程上加載一個文件,然後加載到HtmlAgilityPack中。然後所有的線程寫入一個文件,在那裏存儲所有線程的解析結果。這是我的處理器不使用40%最大處理能力的原因嗎?我有一個i7。順便說一句,我試圖消除寫操作(對單個文件),它似乎沒有更好。所以從光盤加載文件時應該是這個問題?這是我一個接一個做的事情,每當我加載一個我創建一個新線程並將該文件作爲參數發送時。 – Devela 2012-04-28 04:18:04

相關問題