Прошло много времени с тех пор, как я спросил это и получил много полезных ответов, но я столкнулся с интересной проблемой, связанной с этим, и подумал, что я опубликую это здесь как еще один ответ:
Вам следует позвонитьCancellationTokenSource.Dispose()
только тогда, когда вы уверены, что никто не собирается пытаться получить свойство Token
CTS.В противном случае вы должны не назвать это, потому что это раса.Например, см. Здесь:
https://github.com/aspnet/AspNetKatana/issues/108
В исправлении этой проблемы код, который ранее делал cts.Cancel(); cts.Dispose();
, был отредактирован так, чтобы просто делать cts.Cancel();
, потому что кому-то так не повезло, чтобы попытатьсячтобы получить токен отмены для наблюдения за состоянием отмены после Dispose был вызван, к сожалению, также потребуется обработать ObjectDisposedException
- в дополнение к OperationCanceledException
, который они планировали.
Еще одно ключевое замечание, относящееся к этому исправлению, сделано Tratcher: «Утилизация требуется только для токенов, которые не будут отменены, так как отмена делает все ту же очистку».то есть просто делать Cancel()
вместо утилизации - это действительно хорошо!