2012-04-26 7 views
0

私はマルチスレッドアプリケーションが処理するスレッドの数を増やしても60%の処理能力を得られないことに気付きました。コードを調べて、おそらくDLL(Html Agility Pack)への呼び出しが非同期的に実行されていない可能性があることがわかりました。コールを並行して行う方法はありますか?毎回ブロックするDLLを呼び出さなければならないマルチスレッドアプリケーションを作成する方法

+0

新しいスレッドを生成し、ブロックメソッドを呼び出すのは好きですか? –

+0

どうすればdllを呼び出すのですか – Likurg

+0

@Likurg私は基本的に各スレッドで別のドキュメントを作成し、htmlドキュメントを読み込んだ後、いくつかのxpathクエリを実行します。 – Devela

答えて

0

最初の質問は、どのようにスレッドを管理しますか?私は管理されたThreadPoolsを使って良い経験をしました。システムはリソース自体を管理します。

私は、メソッドやDLLを呼び出すために代理人を使用することをお勧めしますスレッドセーブと非同期。良いMSDNの記事があるthreadpoolingについて: http://support.microsoft.com/kb/315582/en-us

してくださいフィードバックいくつかのコード例をこれで問題が解決しない場合:あなたはそれについていくつかの良いRessourceの記事を見つけることができます。ここhttp://msdn.microsoft.com/en-us/library/3dasc8as%28v=vs.80%29.aspx

+0

問題はスレッドではありません。問題は、参照されているDLLの関数を呼び出すことです。それらは異なるスレッドから呼び出されますが、最終的には何らかの形でマーシャリングされ、同期的に呼び出されます。 – Devela

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にロードされているファイルをロードしています。その後、すべてのスレッドが1つのファイルに書き込まれ、すべてのスレッドの解析結果が格納されます。これは私のプロセッサが最大処理能力の40%を使用しない理由ですか?私はi7を持っています。ところで、私は書き込み操作を(1つのファイルへ)削除することを試みました、そしてそれは良くないようです。ディスクから文書を読み込むときに問題が起こるはずですか?これは私が次々にやることです。毎回新しいスレッドを作成し、そのファイルをパラメータとして送信します。 – Devela

関連する問題