首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >即时任务取消

即时任务取消
EN

Stack Overflow用户
提问于 2018-08-30 09:19:04
回答 1查看 1.4K关注 0票数 1

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

通常的做法如下:

代码语言:javascript
复制
var cts = new CancellationTokenSource();
var t = Task.Run(() => {    
while(true)
  {
    if (!cts.IsCancellationRequested)   
     {  //do stuff }
  }
}, cts.Token);

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

代码语言:javascript
复制
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的正确方式还是有更好的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-30 10:19:08

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52093400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档