0

我使用下面的代碼:默認參數 - 的CancellationToken

public async Task SendMessage(string msg, CancellationToken ct = default(CancellationToken)) 

但我認爲這是錯誤的,因爲如果主叫通話SendMessage沒有providind取消標記的代碼將使用默認令牌與CancellationToken.None意味着運行,所以它會等待沒有時間到期。

所以也許這是比較好的:

public async Task SendMessage(string msg, CancellationToken ct) 

你覺得呢?

感謝

+0

*「這是一個好主意,只會讓你的*'CancellationToken' *參數可選的公共API中(如果有的話),並把它們作爲必要的參數隨處可見其他「。* - 回答並鏈接到下面答案中提供的文章。 – Svek

回答

0

是的,如果你想調用者總是傳遞CancelationToken,必須有明確的參數迫使它:

public async Task SendMessage(string msg, CancellationToken ct) 

原因,呼叫者可以通過CancellationToken.None,但它不是你的選擇。您創建需要CancellationToken的「合同」。

2

這真的取決於你的實施方法......瀏覽以下內容:

可選的CancellationToken參數

如果你想接受的CancellationToken,但要使它可選, 你可以用的語法做到像這樣:

public Task SomethingExpensiveAsync(CancellationToken cancellationToken = default(CancellationToken)) 
{ 
    // don’t worry about NullReferenceException if the 
    // caller omitted the argument because it’s a struct. 
    cancellationToken.ThrowIfCancellationRequested(); 
} 

這是一個好主意僅在您的公共API中使您的CancellationToken參數 可選(如果有),並將其保留爲 其他地方的必需參數。這確實有助於確保 您有意通過您調用的所有 方法(上面的#2)傳播您的CancellationToken。但是當然要記得切換到 通過CancellationToken.None一旦你通過沒有 取消點。

這也是一個很好的API模式,以保持您的CancellationToken爲您的方法接受的最後一個參數 。這與參數 參數很好地匹配,因爲它們必須在任何所需的 參數後出現。

從MSDN摘自:Recommended patterns for CancellationToken