3

CancellationTokenSource还处理任何小孩CancellationTokenRegistration通过Token.Register()获得的物品?或者我必须单独处理每个注册?Dispostion of CancellationTokenSource及其子小孩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); 
     } 
    } 
} 

回答

7

相反的是the documentation说,你不处理CancellationTokenRegistration释放资源,你这样做是为了使注册无效。也就是说,即使令牌被取消,您也不希望已注册的代理人再次启动。

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

相关问题