BT

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

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Task Parallelライブラリの新しいキャンセルフレームワークのご紹介

Task Parallelライブラリの新しいキャンセルフレームワークのご紹介

原文(投稿日:2009/11/11)へのリンク

.NETのTask Parallelライブラリは、ベータ2のためにモデルチェンジを行なった。パフォーマンスと機能性の両面を向上させた、老朽化したThreadPoolを置き換えるライブラリになると期待されている。向上のひとつとして、ThreadPoolがタスクをキャンセルすることができないことについて記述されている。ご存じかもしれないが、現状ではタスクがいったん古いプールに置かれると、タスクを中断するいかなる手段も存在していない。

Task Parallelライブラリは、いつでもキャンセルをサポートする予定だったが、ベータ2では、実装や露出に影響する重大な変更が加えられた。新しいモデルの表の顔はCancellationTokenを内包するCancellationTokenSourceだ。これは、タスクメンバーのCancel、AcknowledgeCancellation、IsCancellationRequested、Current、Parent、列挙型のTaskCreationOptions.RespectParentCancellationの必要性を取り除く。これにより、多くのメソッドが任意のCancellationTokenを渡すことができる。

オブジェクトは、ひとつ以上のタスクをキャンセルするためにCancellationTokenSourceの参照を保持する必要がある。キャンセル処理に応じる必要があるタスクは、CancellationTokenへの参照のを得て、定期的に自身のIsCancellationRequestedプロパティをチェックする。それが適切な場合、複数のタスクが同じCancellationTokenを共有することができる。キャンセルの要求を受け入れるために、各タスクはOperationCanceledExceptionをスローする必要がある。

以前のベータでは、タスクは親子関係を理解していた。それらの関係とそれらの関連した行動は、開発者抜きで自動的に確立されていた。ベータ2では、その決定は覆された。親子関係は、開発者がそれを求めるときだけ確立され、それ意外では、各タスクは自律していると考えられている。

もし、親子タスクを選択した場合、例外の伝搬や子タスクが完了するまで、親タスクが明示的に待つなどの機能が必要になる。もし、そうしないのであれば、タスクは、ThreadPoolのすばらしい代替になるだろう。

ほとんどの未処理例外と同じようにTPL例外が無視されるとアプリケーションはクラッシュします。例外を監視するためにタスクがガベージコレクトされる前にタスクのWaitを呼ぶか、例外プロパティをチェックする必要がある。ベータ2には、もう一つのオプション、UnobservedTaskExceptionイベントが追加されている。これは、ダメージを与える直前に開発者に対して最後のチャンスを与える。

ベータ2の変更についてさらに知りたい場合は、Parallel Programming with .NET blogをご覧いただきたい。

この記事に星をつける

おすすめ度
スタイル

BT