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時,意味着關聯的令牌不能再被取消。這意味着您可以確保註冊的代表不會被觸發,因此在這種情況下沒有理由處置註冊。

相關問題