gpt4 book ai didi

c# - 立即取消任务

转载 作者:太空宇宙 更新时间:2023-11-03 19:42:05 27 4
gpt4 key购买 nike

我对使用 cancellationToken 和 cancellationTokenSource 取消任务有疑问:

通常的方式如下:

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

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

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 关联的任务将立即停止执行,而不是像通常的实现那样必须完成当前的 for 迭代。我的问题是:这是立即停止 Task 的正确方法还是有更好的方法?

最佳答案

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

关于c# - 立即取消任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52093400/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com