How to cancel a CancellationToken

跟風遠走 提交于 2020-06-09 15:26:20

问题


I start a task, that start other tasks and so forth.
Given that tree, if any task fails the result of the whole operation is useless. I'm considering using cancellation tokens. To my surprise, the token does not have a "CancelThisToken()" method...

So my question is: how can I, in possession of ONLY a CancellationToken, cancel it?


回答1:


As the docs state you need to call the cancel method from the source object. Example code is included in the link you provided. Here are the relevant sections:

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

CancellationToken Struct

how can I, in possession of ONLY a CancellationToken, cancel it?

Without a reference to the source you cannot cancel a token. That doesn't mean that you need the CancellationTokenSource that first spawned the token. When given a CancellationToken, you can create a new instance of token source assign it's token to the provided token and cancel it. All other parties that can read this token will see that it's cancellation has been requested.




回答2:


As an extension of the answers provided so far, if you want to have both a CancellationToken instance provided to your methods, and cancel internally, you should examine CancellationTokenSource.CreateLinkedTokenSource. In essence this will cancel either when cts.Cancel() is called, or one of its supplied tokens is.




回答3:


A token it gives you the right to know someone is trying to cancel something. It does not give you the right to actually signal a cancellation. Only the cancellation token source gives you that. This is by design.




回答4:


Spawn CancellationToken instances from a CancellationTokenSource instance and call Cancel on the CTS instance.

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

There's also a way to gracefully cancel threads without them firing exceptions, just check the CT for IsCancellationRequested and handle the case yourself. More info: Use of IsCancellationRequested property?



来源:https://stackoverflow.com/questions/30875279/how-to-cancel-a-cancellationtoken

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!