3

Dispose()CancellationTokenSourceToken.Register()을 통해 얻은 어린이 CancellationTokenRegistration 개체를 처분합니까? 또는 각 등록을 개별적으로 처분해야합니까?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 : the documentation의 말씀에

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

는 달리, 당신은 당신은 등록이 유효하게 수행 리소스를 해제하는 CancellationTokenRegistration을 버리지 않습니다. 즉, 토큰이 취소 된 경우에도 등록 된 대리자가 더 이상 실행되지 않게하려는 것입니다.

CancellationTokenSource을 처리 할 때 연관된 토큰을 더 이상 취소 할 수 없다는 의미입니다. 즉, 등록 된 대리인이 발동하지 않는다는 것을 확신 할 수 있으므로이 경우 등록을 처분 할 이유가 없습니다.