You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用CancellationTokenSource取消指定任务(如任务5)

如何取消特定任务(如任务5)?

你的原代码存在核心问题:循环中创建的CancellationTokenSource都是局部变量,循环结束后无法再引用到任务5对应的实例,自然没法触发取消操作。要实现取消特定任务,需要保存每个任务对应的CancellationTokenSource,具体方案如下:

步骤1:存储任务与取消令牌源的关联

用字典记录每个任务编号对应的CancellationTokenSource,后续可通过任务编号快速定位:

// 字典:键为任务编号,值为对应的取消令牌源
var taskTokenMap = new Dictionary<int, CancellationTokenSource>();

for (int i = 0; i < 10; i++)
{
    var tokenSource = new CancellationTokenSource();
    var token = tokenSource.Token;
    // 捕获当前循环的i值,避免闭包引用导致任务编号混乱
    int taskNumber = i;
    
    Task.Factory.StartNew(() => DoSomeWork(taskNumber, token), token);
    // 将任务与令牌源绑定存入字典
    taskTokenMap.Add(taskNumber, tokenSource);
}

步骤2:取消指定任务(任务5)

通过字典找到任务5对应的令牌源,调用Cancel()触发取消:

// 取消任务5
if (taskTokenMap.TryGetValue(5, out var targetTokenSource))
{
    targetTokenSource.Cancel();
    // 可选:取消后移除字典记录,避免内存泄漏
    taskTokenMap.Remove(5);
}

步骤3:确保任务内部响应取消

CancellationToken是协作式的,任务内部必须主动检查取消请求才能生效。修改DoSomeWork方法,在关键节点处理取消:

static void DoSomeWork(int taskNum, CancellationToken ct)
{
    try
    {
        while (true)
        {
            // 模拟业务工作
            Console.WriteLine($"任务{taskNum}执行中...");
            
            // 方式1:检查取消状态后手动退出
            if (ct.IsCancellationRequested)
            {
                Console.WriteLine($"任务{taskNum}已取消");
                break;
            }
            
            // 方式2:抛出异常终止任务(更符合Task取消规范)
            ct.ThrowIfCancellationRequested();
            
            // 模拟耗时操作,同时传入令牌支持中途取消
            Task.Delay(1000, ct).Wait();
        }
    }
    catch (OperationCanceledException)
    {
        Console.WriteLine($"任务{taskNum}通过异常终止");
    }
}

关键注意事项

  • 闭包问题:循环内必须创建taskNumber = i的副本,否则所有任务会捕获同一个i的引用,导致任务编号错误。
  • 资源清理:取消任务后建议从字典移除对应的令牌源,并调用Dispose()释放资源(可选但推荐)。
  • 协作式取消:任务内部必须主动检查取消令牌,否则即使调用Cancel(),任务也会继续执行。

内容的提问来源于stack exchange,提问作者Jon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 01:50:17