5

是否还会处理通过 获得Dispose()CancellationTokenSource任何子CancellationTokenRegistration对象Token.Register()?还是我必须单独处理每个注册?

示例 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);
        }
    }
}
4

1 回答 1

9

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

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

于 2013-10-10T10:00:31.987 回答