web-dev-qa-db-ja.com

C#-ThreadPoolとタスク

.NET 4.0で見た人もいるかもしれませんが、新しい名前空間System.Threading.Tasksを追加しました。これは基本的にはタスクという意味です。 ThreadPoolを使用してから、私は数日間しか使用していません。

どちらがより効率的でリソース消費が少ないのですか? (または全体的に良いですか?)

60
TheAJ

Tasks名前空間の目的は、プラグイン可能なアーキテクチャを提供して、マルチタスクアプリケーションを作成しやすくし、柔軟性を高めることです。

実装はTaskSchedulerオブジェクトを使用してタスクの処理を制御します。これには、独自のタスク処理を作成するためにオーバーライドできる仮想メソッドがあります。メソッドには、たとえば

protected virtual void QueueTask(Task task)
public virtual int MaximumConcurrencyLevel

.NETスレッドの実装にはラッパーがあるため、デフォルトの実装を使用する場合、わずかなオーバーヘッドが発生しますが、それが巨大になるとは思いません。

単一のスレッドで複数のタスクを実装するカスタムTaskSchedulerの(ドラフト)実装があります here

24
Jeremy McGee

どちらがより効率的でリソース消費が少ないのですか?

無関係で、違いはほとんどありません。

(または全体的に良い)

Taskクラスは、スレッドを開始および結合するための非常にクリーンなインターフェイスを提供し、例外を転送するため、使いやすくなります。また、(制限された)形式の負荷分散もサポートしています。

19
Henk Holterman

「.NET Framework 4以降、TPLはマルチスレッドおよび並列コードを記述するための好ましい方法です。」

http://msdn.Microsoft.com/en-us/library/dd460717.aspx

14
Ivan Ičin

Thread

ベアメタルの場合、おそらくそれを使用する必要はありません。おそらくLongRunningタスクを使用して、その機能を活用できます。

タスク

スレッドの上の抽象化。 スレッドプールを使用(タスクをLongRunning操作として指定しない限り、そうであれば、新しいスレッドが内部で作成されます)。

スレッドプール

名前が示すように:スレッドのプール。 .NETフレームワークが処理するスレッドの数は限られていますか。どうして?わずか8コアのCPUで100のスレッドを開いて高価なCPU操作を実行することは、間違いなく良い考えではありません。フレームワークはこのプールを維持し、スレッドを再利用し(各操作でスレッドを作成または強制終了しません)、CPUが燃えないようにスレッドの一部を並列に実行します。

わかりましたが、それぞれをいつ使用するのですか?

再開:常にタスクを使用します。

タスクは抽象的であるため、使いやすいです。常にタスクを使用してみて、自分でスレッドを処理する必要がある問題が発生した場合(おそらく1%)、スレッドを使用することをお勧めします。

ただし、次のことに注意してください。

  • I/Oバウンド:I/Oバウンド操作(データベース呼び出し、ファイルの読み取り/書き込み、API呼び出しなど)の場合通常のタスクを使用しないLongRunningを使用必要な場合はタスクまたはスレッドですが、通常のタスクは必要ありません。なぜなら、いくつかのスレッドがビジー状態で、プールを取得する順番を待っている多くの別のタスクを持つスレッドプールにつながるからです。
  • CPUバウンド:CPUバウンド操作の場合は、通常のタスクを使用して満足します。
6

スケジューリングは、並列タスクの重要な側面です。

スレッドとは異なり、新しいタスクは必ずしもすぐに実行を開始するとは限りません。代わりに、作業キューに配置されます。通常、コアが使用可能になったときに、関連するタスクスケジューラがキューからタスクを削除すると、タスクが実行されます。タスクスケジューラは、システムの同時実行の程度を制御することにより、全体的なスループットを最適化しようとします。十分なタスクがあり、タスクに依存関係のシリアル化が十分にない限り、プログラムのパフォーマンスは利用可能なコアの数に比例します。このように、タスクは潜在的な並列処理の概念を具体化します

Msdnで見たように http://msdn.Microsoft.com/en-us/library/ff963549.aspx

5

ThreadPoolTaskの違いは非常に簡単です。タスクを理解するには、スレッドプールについて知っておく必要があります。

ThreadPoolは、基本的に空きスレッドの管理と再利用に役立ちます。つまり、スレッドプールはバックグラウンドスレッドのコレクションです。

タスクの簡単な定義は次のとおりです。

Task workは、作業単位を非同期的に管理します。簡単に言えば、タスクは新しいスレッドを作成しません。代わりに、スレッドプールのスレッドを効率的に管理します。タスクは、タスクをスレッドにキューイングするTaskSchedulerによって実行されます。

3
J. Doe

タスクについて考慮すべきもう1つの良い点は、ThreadPoolを使用する場合、実行中のスレッドを中断または待機する方法がない(スレッドのメソッドで手動で実行しない限り)が、タスクを使用して可能。私が間違っている場合は私を修正してください

3