BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース ThreadPoolがTask、ContinuationおよびFutureに取って代わる

ThreadPoolがTask、ContinuationおよびFutureに取って代わる

.NET 4.0で、スレッドプールの新バージョンが利用可能になる。パフォーマンスおよびロードバランシングの拡張機能に加えて、この新たなスレッドプールはTaskの使用を可能にする。Taskは軽量の作業ユニットで、ThreadPool.QueueUserWorkItemを使用して作成するものと類似している。しかし、匿名の作業アイテムとは異なり、Taskオブジェクトは高機能なAPIを公開する。Task.StartNew機能への呼び出しからの戻り値を取り込むことで、 このAPIにアクセスすることができる。

スレッドに対する機能と同様に、この機能はデリゲートや実行されるべき作業を定義する匿名機能を受け入れる。

ちょうどフルスレッドのように、タスクはメソッドを公開して、スケジューリングスレッドがタスクの終了を待機できるようにする。メソッドはWait、WaitAnyおよびWaitAllであり、後者2つは、タスクのリストを受け入れる。待機は完全であるか、最大のタイムアウトになる。

待機があると、待機スレッドがブロックされる。ブロックが適切な選択ではなく、現在のタスクが完了したら、アクションを実行したい場合、続行を使用でき る。この場面での続行は、タスクや一連のタスクが完了した場合に実行される予定の操作である。続きのタスクを予定するには、ContinueWith、ContinueWithAllまたはContinueWithAny機能を呼び出して、それをデリゲートに受け渡す。この機能は、複数回にわたって呼び出すことができ、操作のパイプラインを効率的に作成する。

現在.NETがあまりうまくサポートしていない分野の1つが、キャンセルである。現在のスレッドプールから不要なタスクを除去する手段はなく、スレッドア ボートは非常に危険であると見なされている。.NET 4では、タスクのキャンセルはファーストクラスシチズンとなる。開始されていないタスクがキャンセルされると、即座にキューから除去される。タスクが開始 すると、操作との協調が必要となる。タスクの作業を実際に実行するデリゲートは、定期的にIsCancellationRequestedプロパティをチェックして、適切な対応をする必要がある。

Taskはこれまで.NETになかった機能であるが、親と子の関係をサポートする。これにより、複雑なタスクが細かいパーツに分解されるが、それでも1つ の論理的な操作としてとらえられる。これには、キャンセルなどをサポートするといった、大きなメリットがある。親タスクがキャンセルされると、任意的に子 タスクもキャンセルされる。

特徴は、機能を非同期に実行するタスクである。機能の結果が必要な場合、機能が完了したかどうかをFutureが確認する。完了した処理である場合、値を返し、未完了である場合、何が発生するのかは、実装次第である。

例えば、Reading the Valueプロパティは、タスク完了までスレッドがブロックする原因になる。他のタスクのように、IsCompletedプロパティおよびWait、ContinueWithおよびCancelメソッドにアクセスできる。この追加機能により、.NET機能がテキストブックの記述以上に強化される。この理由から、とりわけ.NET 4.0 futureはTaskと名前変更されている。ここで T は戻りの型である。

.NETのTaskは、スレッドセーフなそう差に限定されない。グローバル変数を変更することでデリバティブを計算するfutureを阻止するものは、何 もない。これは、通常のロッキングやオブジェクトの所有ルールがまだ適用されるが、もちろんこれらは専ら不変のオブジェクトを使用して、縮小できることを 意味する。

Tasksについて詳しくは、Daniel Moths氏の「Introducing the new Task type」(リンク)およびStephen Toub氏の「Useful Abstractions Enabled with ContinueWith」(リンク)を参照のこと。

 

原文はこちらです:http://www.infoq.com/news/2009/02/Tasks

この記事に星をつける

おすすめ度
スタイル

BT