web-dev-qa-db-ja.com

CancellationTokenをキャンセルする方法

他のタスクなどを開始するタスクを開始します。
そのツリーを考えると、いずれかのタスクが失敗すると、操作全体の結果は役に立たなくなります。キャンセルトークンの使用を検討しています。驚いたことに、トークンには「CancelThisToken()」メソッドがありません...

私の質問は次のとおりです:[〜#〜] only [〜#〜]a CancellationToken 、キャンセルしますか?

33
Leonardo

ドキュメントに記載されているように、ソースオブジェクトからcancelメソッドを呼び出す必要があります。サンプルコードは、指定したリンクに含まれています。関連するセクションは次のとおりです。

// Define the cancellation token.
CancellationTokenSource source = new CancellationTokenSource();
previouslyProvidedToken = source.Token;
...
source.Cancel();

https://msdn.Microsoft.com/en-us/library/system.threading.cancellationtoken(v = vs.110).aspx

cancellationTokenのみを所有している場合、どうすればキャンセルできますか?

ソースへの参照がないと、トークンをキャンセルできません。これは、最初にトークンを生成したCancellationTokenSourceが必要という意味ではありません。トークンを指定すると、トークンソースの新しいインスタンスを作成して、そのトークンを提供されたトークンに割り当ててキャンセルできます。このトークンを読み取ることができる他のすべての関係者は、キャンセルが要求されたことを確認できます。

59
RyanS

これまでに提供された回答の拡張として、メソッドにCancellationTokenインスタンスの両方を提供したい場合、and内部でキャンセルします、 _CancellationTokenSource.CreateLinkedTokenSource_ を調べる必要があります。本質的に、これはcts.Cancel()が呼び出されたとき、または提供されたトークンの1つが呼び出されたときにキャンセルされます。

7
Daniel Park

CancellationTokenSourceインスタンスからCancellationTokenインスタンスを生成し、CTSインスタンスでCancelを呼び出します。

例: https://msdn.Microsoft.com/en-us/library/dd321955(v = vs.110).aspx

例外を発生させずにスレッドを正常にキャンセルする方法もあります。IsCancellationRequestedのCTを確認し、自分でケースを処理してください。詳細: IsCancellationRequestedプロパティの使用?

0
Machinarius