私はほとんどのスレッドライブラリを広範囲に使用しました。私は、新しいスレッドの作成、BackgroundWorkersの作成、および組み込みの.NET ThreadPoolの使用にかなり精通しています(これらはすべて非常に優れています)。
ただし、 Task クラスを使用する理由は見つかりませんでした。それらを使用している人の例を1つか2つ見たことがありますが、例はあまり明確ではなく、新しいスレッドの代わりにタスクを使用する必要がある理由の概要を示していませんでした。
質問1:高レベルから、タスクを使用するのは、.NETの他の並列処理方法の1つと比べていつ便利ですか?
質問2:タスクの使用方法を示す簡単または中程度の難易度の例を持っている人はいますか?
Task
sを使用する主な利点は2つあります。
Task
は、単なる計算ではなく、将来利用可能になる任意の結果を表すことができます(一般的な概念は.Netに固有ではなく、 future と呼ばれます)。これは、非同期操作にasync
sを使用するawait
-Task
で特に重要です。結果を取得する操作が失敗する可能性があるため、Task
sも失敗を表すことができます。Task
には、それらを操作するためのメソッドがたくさんあります。終了するまで同期的に待機し(Wait()
)、結果を待機し(Result
)、Task
が終了したときに操作を設定し(ContinueWith()
)、いくつかのメソッドで機能するメソッドを設定できます。 Task
s(WaitAll()
、WaitAny()
、ContinueWhenAll()
)。これはすべて、他の並列処理方法を使用して可能ですが、手動で行う必要があります。また、Task
を使用することには、いくつかの小さな利点もあります。
TaskScheduler
を使用して、Task
をいつどこで実行するかを決定できます。これは、たとえば、 IスレッドでTask
を実行する 、 並列度を制限する 、または Task
レベルのリーダー-ライターを持つ)の場合に役立ちます。ロック 。Task
sは、 CancellationToken
を介して協調キャンセルをサポートします。Task
sには、いくつかのパフォーマンスの改善があります。たとえば、より効率的な処理のためにワークスティーリングキューを使用し、インライン化もサポートします(同期的に待機するスレッドでまだ開始されていないTask
を実行します)。