处置 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);
        }
    }
}

处置 CancelTokenSource 及其子 CancelTokenRegistration

与文档所说的相反,您不会释放CancellationTokenRegistration来释放资源,而是为了使注册无效。也就是说,您不希望注册的委托再触发,即使令牌被取消也是如此。

当您处置CancellationTokenSource时,这意味着无法再取消关联的令牌。这意味着您可以确定注册的委托不会触发,因此在这种情况下没有理由处置注册。

相关文章:
  • 没有找到相关文章