在 .NET 里,取消是“协作式”的:框架不会强行杀掉线程,你的代码要主动检查并尽快退出。
public Task DoWorkAsync(CancellationToken ct)
{
// ...
}
然后一路传下去(HTTP/DB/Delay 都有 ct 重载):
await Task.Delay(1000, ct);
var s = await http.GetStringAsync(url, ct);
foreach (var item in items)
{
ct.ThrowIfCancellationRequested();
await HandleAsync(item, ct);
}
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
await DoWorkAsync(cts.Token);
常见:把“请求取消”和“全局停机取消”合并。
using var linked = CancellationTokenSource.CreateLinkedTokenSource(requestCt, appStoppingCt);
await DoWorkAsync(linked.Token);
取消是正常路径: