6

爲什麼下面甚至合法?註冊CancellationToken.None安全嗎?

CancellationToken.None.Register(delegate { }); 

爲什麼,例如,Register在這裏不會引發異常?是否因爲上述數量爲NOP

背景:的原因的提問是瞭解是否接受CancellationToken需求的方法中對防守時CancellationToken.None登記涉及編碼。

回答

10

CancellationToken.None不是空引用,而是一個空的取消標記。因此,它確實有一個實例。註冊永遠不會開火,因爲信息來源永遠不會註冊爲被取消,但它會「正確地」通過。

但是,我仍然會對此進行檢查和代碼防護,但是,除非您謹慎處理CancellationTokenRegistration正確返回。


編輯:

經進一步調查,如果您對註冊CancellationToken.None,你將有效地無所事事,而返回的CancellationTokenRegistration不需要處理。這不會保留對你的對象或委託的引用,也不會形成泄漏,所以它不適用於實際目的。這應該是安全的,並且不應該需要防禦性做法才能避免。

+0

我意識到CancellationToken是一個值類型,因此始終有一個值,其中CancellationToken.None等於默認構造的值。但是,您認爲註冊是否爲空標記本身的NOP,因此不需要防禦? – 2011-03-30 17:13:38

+0

@Atif:我剛剛經過並檢查了實際發生的事情 - 這是安全的,不需要防禦。 (我編輯了我的答案以顯示)在Register方法中有一個檢查只返回一個新的註冊,並且如果令牌無法取消,則完全忽略該委託,CT.None就是這種情況。 – 2011-03-30 17:18:28

+0

有趣。我沒有找到你檢查你提到:),因此我的問題。 – 2011-03-30 17:22:44