处置CancellationTokenSource及其子CancellationTokenRegistration

avo*_*avo 4 .net c# task-parallel-library async-await cancellationtokensource

难道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);
    }
}
Run Code Online (Sandbox Code Playgroud)

例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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

svi*_*ick 8

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

处理时CancellationTokenSource,意味着无法再取消关联的令牌.这意味着您可以确保注册的代表不会触发,因此在这种情况下没有理由处理注册.