Как отменить CancellationToken

Я запускаю задачу, которая запускает другие задачи и так далее.
Учитывая это дерево, если какая-либо задача терпит неудачу, результат всей операции бесполезен. Я рассматриваю возможность использования токенов отмены. К моему удивлению, токен не имеет метода" CancelThisToken ()"...

Итак, мой вопрос: как я могу, имея только a CancellationToken, отменить его?

3 ответов


в качестве состояния docs вам нужно вызвать метод 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, который первым породил токен. При задании токена можно создать новый экземпляр источника токена, назначить токен предоставленному токену и отменить его. Все другие стороны, которые могут прочитать этот токен, увидят, что его отмена была запрошена.


в качестве дополнения ответов, представленных до сих пор, если вы хотите иметь как CancellationToken экземпляр, предоставленный вашим методам,и отменить внутренне, вы должны рассмотреть CancellationTokenSource.CreateLinkedTokenSource. По сути это отменит либо когда cts.Cancel() называется, или один из ее маркеров.


порождать экземпляры CancellationToken из экземпляра CancellationTokenSource и вызывать Cancel на экземпляре CTS.

пример:https://msdn.microsoft.com/en-us/library/dd321955 (v=против 110).aspx

есть также способ изящно отменить потоки без их исключения, просто проверьте CT на IsCancellationRequested и обработайте дело самостоятельно. Дополнительная информация: использование свойства IsCancellationRequested?