默认参数 - CancellationToken

时间:2017-02-25 16:47:48

标签: c# .net cancellation cancellation-token

我使用以下代码:

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

但我认为这是错误的,因为如果调用者在没有提供取消令牌的情况下调用SendMessage,则代码将使用与CancellationToken.None相同的默认值运行,因此它将在没有时间到期的情况下等待

所以也许这样更好:

public async Task SendMessage(string msg, CancellationToken ct)

您怎么看?

2 个答案:

答案 0 :(得分: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();
}
     

最好只制作CancellationToken参数   您的公共API中的可选项(如果有的话)并将其保留为   其他地方都需要参数。这确实有助于确保这一点   你有意地通过所有的传播你的CancellationTokens   你打电话的方法(上面#2)。但当然记得切换到   通过CancellationToken.None一旦你通过了没有   消除。

     

这也是一个很好的API模式,可以将CancellationToken保持为   方法接受的最后一个参数。这非常适合可选   参数无论如何,因为他们必须在任何需要之后出现   参数。

摘自MSDN:Recommended patterns for CancellationToken

答案 1 :(得分:0)

是的,如果您希望调用者始终通过CancelationToken,则必须使用显式参数强制它:

public async Task SendMessage(string msg, CancellationToken ct)

原因是,来电者可以通过CancellationToken.None,但这不是您的选择。您创建需要CancellationToken的“合同”。