第10章 キャンセル キャンセル
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
.NET 4.0フレームワークでは、網羅的でよく設計されたキャンセル・サポートが導入された。このサポートは協調的であり、キャンセルを要求することはできるが、コードに強制することはできない。キャンセルは協調的であるため、キャンセルをサポートするようにコードを記述しない限り、コードをキャンセルすることはできない。このため、できるだけ多くのコードでキャンセルをサポートすることをお勧めする。
キャンセルは一種の信号であり、キャンセルのトリガーとなるソースと、キャンセ ルに応答するレシーバーという2つの異なる側面を持つ。.NETでは、ソースはCancellationTokenSource であり、レシーバーはCancellationToken である。この章のレシピは、通常の使用におけるキャンセルのソースとレシーバーの両方をカバーし、非標準のキャンセル形式と相互運用するためにキャンセルサポートを使用する方法について説明する。
キャンセル は特殊なエラーとして扱われる。キャンセルされたコードは、OperationCanceledException (またはTaskCanceledException のような派生型)の例外を投げるという慣例がある。こうすることで、呼び出し元のコードはキャンセルが観測されたことを知ることができる。
呼び出しコードにメソッドがキャンセルをサポートしていることを示すには、CancellationToken をパラメータとして取る必要がある。このパラメータは、メソッドが進行状況も報告する場合を除き、通常は最後のパラメータとなる(レシピ2.3)。キャンセルを必要としないコンシューマには、オーバーロードやデフォルト値のパラメータを提供することも考えられる:
publicvoidCancelableMethodWithOverload(CancellationTokencancellationToken){// Code goes here.}publicvoidCancelableMethodWithOverload(){CancelableMethodWithOverload(CancellationToken.None);}publicvoidCancelableMethodWithDefault(CancellationTokencancellationToken=default){// Code goes here.}
CancellationToken.None は、決してキャンセルされないキャンセルトークンを表し、 と等価性のある特殊な値である。コンシューマは、演算子がキャンセ ルされることを望まない場合に、この値を渡す。default(CancellationToken)
非同期ストリームのキャンセルの処理方法は似ているが、より複雑である。非同期ストリームのキャンセルについては、レシピ3.4()で詳しく説明する。
10.1 キャンセル要請の発行
問題
あなたのコードはキャンセル可能なコード(それはCancellationToken を取る)を呼び出し、あなたはそれをキャンセルする必要がある。
解決策
CancellationTokenSource タイプは、CancellationToken のソースである。 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access