处置 CancelTokenSource 及其子 CancelTokenRegistration
本文关键字:CancelTokenRegistration CancelTokenSource 处置 | 更新日期: 2023-09-27 18:34:36
CancellationTokenSource
Dispose()
是否也会处理通过Token.Register()
获得的任何子CancellationTokenRegistration
对象?还是我必须单独处置每个注册?
示例 1:
async Task GoAsync(CancellationToken ct1, CancellationToken ct2)
{
using (var cts = CancellationTokenSource.CreateLinkedTokenSource(ct1, ct2))
{
cts.Token.Register(() => Debug.Print("cancelled"), false)
await Task.Delay(1000, cts.Token);
}
}
示例 2:
async Task GoAsync(CancellationToken ct1, CancellationToken ct2)
{
using (var cts = CancellationTokenSource.CreateLinkedTokenSource(ct1, ct2))
{
using (cts.Token.Register(() => Debug.Print("cancelled"), false))
{
await Task.Delay(1000, cts.Token);
}
}
}
与文档所说的相反,您不会释放CancellationTokenRegistration
来释放资源,而是为了使注册无效。也就是说,您不希望注册的委托再触发,即使令牌被取消也是如此。
当您处置CancellationTokenSource
时,这意味着无法再取消关联的令牌。这意味着您可以确定注册的委托不会触发,因此在这种情况下没有理由处置注册。