私はマルチスレッドアプリケーションが処理するスレッドの数を増やしても60%の処理能力を得られないことに気付きました。コードを調べて、おそらくDLL(Html Agility Pack)への呼び出しが非同期的に実行されていない可能性があることがわかりました。コールを並行して行う方法はありますか?毎回ブロックするDLLを呼び出さなければならないマルチスレッドアプリケーションを作成する方法
答えて
最初の質問は、どのようにスレッドを管理しますか?私は管理された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
。
問題はスレッドではありません。問題は、参照されているDLLの関数を呼び出すことです。それらは異なるスレッドから呼び出されますが、最終的には何らかの形でマーシャリングされ、同期的に呼び出されます。 – Devela
@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にロードされているファイルをロードしています。その後、すべてのスレッドが1つのファイルに書き込まれ、すべてのスレッドの解析結果が格納されます。これは私のプロセッサが最大処理能力の40%を使用しない理由ですか?私はi7を持っています。ところで、私は書き込み操作を(1つのファイルへ)削除することを試みました、そしてそれは良くないようです。ディスクから文書を読み込むときに問題が起こるはずですか?これは私が次々にやることです。毎回新しいスレッドを作成し、そのファイルをパラメータとして送信します。 – Devela
- 1. ContactListner(Box2d)のEndContactが毎回LibGDXで呼び出されない
- 2. IAuthorizationFilterが毎回呼び出されない
- 3. ViewModelが毎回呼び出される
- 4. 毎回ログを作成するインターフェイスクラスのメソッドが呼び出されるとき
- 5. なぜフロープレーヤを2回呼び出さなければならないのですか?
- 6. 毎回ではなくJavaScript関数を1回だけ呼び出す
- 7. VB6で作成されたDLLをCから呼び出す
- 8. ページ(django)で毎回get_absolute_urlを呼び出さないようにするには?
- 9. フォームで呼び出されないアクションを作成する
- 10. スーパーを呼び出さなければならないインターフェイス関数のアノテーション
- 11. プログラムがブロックされないようにする呼び出し方法
- 12. VBAで呼び出すことができる単純なPythonコードからDLLを作成する方法
- 13. [self.window makeKeyAndVisible]できます。 rootviewcontrollerを設定する前に呼び出さなければならない
- 14. MVC3 - 毎回2回呼び出されるコントローラのインデックスアクション
- 15. 毎回異なるパラメータを持つメソッドを呼び出すボタンを動的に作成します。
- 16. スレッドを複数回作成する呼び出し方法
- 17. 毎回関数を呼び出すか、ローカル変数を作成する
- 18. MakeGenericType(...)を複数回呼び出すと、毎回新しい型が作成されますか?
- 19. 毎回2回SKActionが呼び出されます(Swift 3)
- 20. オブジェクトを作成せずにコンストラクタを呼び出す方法は?コンストラクタが同じ方法で再び呼び出されないのはなぜですか?
- 21. プロパティが2回呼び出されないようにする
- 22. Giphy API - AJAXコールを作成した後にデータを呼び出す方法を見つけられない
- 23. アンドロイド:「onCreatedView」は、「setUserVisibleHint」が呼び出されないときに毎回呼びます。
- 24. Odoo 10で毎回Python関数を呼び出す方法
- 25. super-deallocを最後に呼び出さなければならないのはなぜですか?
- 26. rvalue referenceでmoveを呼び出さなければならないのはなぜですか?
- 27. 同じメソッドを使用するが、毎回異なるメソッドを呼び出す方法
- 28. 毎回異なる属性を生成する方法
- 29. Observerを2回呼び出さないようにする
- 30. ajax呼び出しをブロックする方法(ブロックしたい)
新しいスレッドを生成し、ブロックメソッドを呼び出すのは好きですか? –
どうすればdllを呼び出すのですか – Likurg
@Likurg私は基本的に各スレッドで別のドキュメントを作成し、htmlドキュメントを読み込んだ後、いくつかのxpathクエリを実行します。 – Devela