65

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

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

4

7 に答える 7

26

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

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

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

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

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

于 2009-11-21T07:30:05.127 に答える
20

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

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

(または全体的に良い)

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

于 2009-11-21T10:20:40.630 に答える
15

「.NETFramework4以降、TPLはマルチスレッドの並列コードを作成するための推奨される方法です。」

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

于 2012-06-05T23:52:52.370 に答える
11

スレッド

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

タスク

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

スレッドプール

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

OK、でもそれぞれをいつ使うの?

履歴書:常にタスクを使用します。

タスクは抽象化であるため、はるかに使いやすくなっています。常にタスクを使用することをお勧めします。スレッドを自分で処理する必要がある問題に直面した場合(おそらく1%の確率で)、スレッドを使用してください。

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

  • I / Oバウンド:I / Oバウンド操作(データベース呼び出し、ファイルの読み取り/書き込み、API呼び出しなど)の場合、通常のタスクを使用LongRunningすることはありません。必要に応じてタスクまたはスレッドを使用しますが、通常のタスクは使用しません。いくつかのスレッドがビジーで、他の多くのタスクがプールを取得する順番を待っているスレッドプールにつながるからです。
  • CPUバウンド:CPUバウンド操作の場合は、通常のタスクを使用して満足してください。
于 2017-07-14T22:53:55.077 に答える
6

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

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

msdnhttp : //msdn.microsoft.com/en-us/library/ff963549.aspxで見たように

于 2012-04-17T13:13:13.387 に答える
5

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

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

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

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

于 2018-09-14T11:46:34.237 に答える
3

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

于 2010-02-03T05:38:38.720 に答える