立即任务取消

问题描述 投票:1回答:1

我有一个关于使用cancellationToken和cancellationTokenSource取消任务的问题:

通常的方法如下:

var cts = new CancellationTokenSource();
var t = Task.Run(() => {    
while(true)
  {
    if (!cts.IsCancellationRequested)   
     {  //do stuff }
  }
}, cts.Token);

因此,while循环一直持续到请求令牌为止。今天,在研究Cancel()方法时,我发现你可以使用Register()方法来定义在请求令牌时运行的其他代码,所以我想知道,如果一个人写了这样的东西怎么办:

var cts = new CancellationTokenSouce();
token=cts.Token;
token.Register(
() => {
//do something to manage the cancel call
return;
};
) 
var t = Task.Run(() => {
//do stuff 
}, cts.Token);

通过这样做,与CancellationToken相关联的任务将立即停止执行,而不必像通常的实现那样完成当前的迭代。我的问题是:这是立即停止Task的正确方法还是有更好的方法?

c# .net task .net-standard cancellation
1个回答
5
投票

Register不会导致任务停止执行它只是一个已经请求取消的通知。 Register的主要目的是能够取消不支持CancellationToken但具有自己的取消机制或可以间接取消的异步操作(例如,通过关闭套接字)。还有一些技巧由Stephen Toub here描述如何用Register取消不可取消的任务。但是,如果您控制应该取消的任务的执行,则您有责任提供取消执行的机制。没有最好的方法来取消任何任务 - 一些任务可以立即取消(你可以使用ThrowIfCancellationRequested),有些可能需要一些额外的处理(你需要检查请求取消,做一些事情,然后抛出异常)。

© www.soinside.com 2019 - 2024. All rights reserved.