【问题标题】:Disposing of CancellationTokenSource and its child CancellationTokenRegistration处理 CancellationTokenSource 及其子 CancellationTokenRegistration
【发布时间】:2013-10-10 02:39:27
【问题描述】:

CancellationTokenSourceDispose() 是否也处理通过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);
        }
    }
}

【问题讨论】:

    标签: c# .net task-parallel-library async-await cancellationtokensource


    【解决方案1】:

    the documentation 所说的相反,您不处置CancellationTokenRegistration 来释放资源,您这样做是为了使注册无效。也就是说,即使令牌被取消,您也不希望已注册的委托再触发。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多