5

多くのパフォーマンスを必要とするタスクに何を使用すればよいか知りたいです。 BackgroundworkerThreadまたはThreadPool?

これまでスレッドを使用してきましたが、アプリケーションの速度を改善する必要があります。

4

3 に答える 3

13

BackgroundWorker は、スレッド プール スレッドと同じものです。UI スレッドでイベントを実行する機能が追加されます。進行状況を表示し、結果で UI を更新するのに非常に便利です。したがって、その典型的な使用法は、作業を行う必要があるときに UI がフリーズするのを防ぐことです。最初の目標はパフォーマンスではなく、コードを非同期に実行することです。このパターンは、Task<> クラスと async/await キーワードによって、後の .NET バージョンでも適切に拡張されています。

スレッド プール スレッドは、リソースの消費を避けるのに役立ちます。スレッドは高価なオペレーティング システム オブジェクトであり、作成できるスレッドの数は非常に限られています。スレッドは、5 つのオペレーティング システム ハンドルと 1 メガバイトの仮想メモリ アドレス空間を使用します。これらのハンドルを早期に解放する Dispose() メソッドはありません。スレッド プールは、主にスレッドを再利用し、アクティブなスレッドが多すぎないようにするために存在します。スレッド プール スレッドは、実行する作業が制限されている場合にのみ使用することが重要です。理想的には、0.5 秒以上かかることはありません。そして頻繁にブロックしません。したがって、パフォーマンスが重要な場合ではなく、短時間の作業に最適です。I/O 完了の処理は、TP スレッドにとって理想的なタスクです。

はい、スレッドを使用してプログラムのパフォーマンスを向上させることもできます。これを行うには、TaskContinuationOptions.LongRunning を使用する Thread または Task<> を使用します。実際にパフォーマンスを向上させるにはいくつかの厳しい要件があり、それらは非常に厳しいものです。

  • 複数のスレッドが必要です。理想的なケースでは、2 つのスレッドでジョブを完了するのに必要な時間を半分にすることができます。少ないほど、使用するスレッドが多くなります。その理想に近づくのは難しいですが、無限に拡張できるわけではありません。Google の「アムダールの法則」で情報を入手してください。
  • 複数のコアを持つプロセッサを搭載したマシンが必要です。入手しやすい昨今。作成するスレッドの数は、使用可能なコアの数を超えてはなりません。それ以上使用すると、通常はパフォーマンスが低下します。
  • プロセッサの実行エンジンを制約付きリソースにする、コンピューティング バウンドの種類のジョブが必要です。それはかなり一般的ですが、確かにスラムダンクではありません. 多くのジョブは、ファイルやデータベース クエリからの読み取りなど、実際には I/O スループットによって制限されます。または、プロセッサが RAM からデータを読み取る速度によって制限されます。このようなジョブはスレッドの恩恵を受けません。複数の実行エンジンを使用できますが、ディスクとメモリ バスは 1 つしかありません。
  • 同期をほとんど必要とせずに複数のスレッドに作業を分散できるアルゴリズムが必要です。これは通常、解決するのが難しい問題です。多くのアルゴリズムは本質的に非常に順次的であり、簡単に並列化することはできません。
  • コードを安定させ、適切に実行するには、時間と忍耐が必要です。スレッド化されたコードを記述するのは難しく、1 か月に 1 回プログラムがクラッシュしたり、場合によっては無効な結果を生成したりするスレッド化の競合は、時間を大幅に浪費する可能性があります。
于 2013-06-09T13:16:46.043 に答える