web-dev-qa-db-ja.com

System.Threading.Taskはいつ役に立ちますか?

私はほとんどのスレッドライブラリを広範囲に使用しました。私は、新しいスレッドの作成、BackgroundWorkersの作成、および組み込みの.NET ThreadPoolの使用にかなり精通しています(これらはすべて非常に優れています)。

ただし、 Task クラスを使用する理由は見つかりませんでした。それらを使用している人の例を1つか2つ見たことがありますが、例はあまり明確ではなく、新しいスレッドの代わりにタスクを使用する必要がある理由の概要を示していませんでした。

質問1:高レベルから、タスクを使用するのは、.NETの他の並列処理方法の1つと比べていつ便利ですか?

質問2:タスクの使用方法を示す簡単または中程度の難易度の例を持っている人はいますか?

18
William

Tasksを使用する主な利点は2つあります。

  1. Taskは、単なる計算ではなく、将来利用可能になる任意の結果を表すことができます(一般的な概念は.Netに固有ではなく、 future と呼ばれます)。これは、非同期操作にasyncsを使用するawait-Taskで特に重要です。結果を取得する操作が失敗する可能性があるため、Tasksも失敗を表すことができます。
  2. Taskには、それらを操作するためのメソッドがたくさんあります。終了するまで同期的に待機し(Wait())、結果を待機し(Result)、Taskが終了したときに操作を設定し(ContinueWith())、いくつかのメソッドで機能するメソッドを設定できます。 Tasks(WaitAll()WaitAny()ContinueWhenAll())。これはすべて、他の並列処理方法を使用して可能ですが、手動で行う必要があります。

また、Taskを使用することには、いくつかの小さな利点もあります。

  1. カスタムTaskSchedulerを使用して、Taskをいつどこで実行するかを決定できます。これは、たとえば、 IスレッドでTaskを実行する並列度を制限する 、または Taskレベルのリーダー-ライターを持つ)の場合に役立ちます。ロック
  2. Tasksは、 CancellationToken を介して協調キャンセルをサポートします。
  3. 計算を表すTasksには、いくつかのパフォーマンスの改善があります。たとえば、より効率的な処理のためにワークスティーリングキューを使用し、インライン化もサポートします(同期的に待機するスレッドでまだ開始されていないTaskを実行します)。
25
svick