CancellationToken 实战:让长任务可取消、可超时、可联动

作者:微信公众号:【架构师老卢】
2-1 10:29
38

在 .NET 里,取消是“协作式”的:框架不会强行杀掉线程,你的代码要主动检查并尽快退出。

1) 入口:方法签名带上 CancellationToken

public Task DoWorkAsync(CancellationToken ct)
{
    // ...
}

然后一路传下去(HTTP/DB/Delay 都有 ct 重载):

await Task.Delay(1000, ct);
var s = await http.GetStringAsync(url, ct);

2) 在循环/长流程中定期检查

foreach (var item in items)
{
    ct.ThrowIfCancellationRequested();
    await HandleAsync(item, ct);
}

3) 超时:CancellationTokenSource + CancelAfter

using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
await DoWorkAsync(cts.Token);

4) 联动取消:CreateLinkedTokenSource

常见:把“请求取消”和“全局停机取消”合并。

using var linked = CancellationTokenSource.CreateLinkedTokenSource(requestCt, appStoppingCt);
await DoWorkAsync(linked.Token);

5) 不要吞掉 OperationCanceledException

取消是正常路径:

  • 该记录日志就记录(但别当成错误告警)
  • 该向上抛就向上抛

参考链接

  • Cancellation in managed threads:https://learn.microsoft.com/dotnet/standard/threading/cancellation-in-managed-threads
相关留言评论
昵称:
邮箱:
阅读排行