我使用以下代码:
public async Task SendMessage(string msg, CancellationToken ct = default(CancellationToken))
但我认为这是错误的,因为如果调用者在没有提供取消令牌的情况下调用SendMessage
,则代码将使用与CancellationToken.None
相同的默认值运行,因此它将在没有时间到期的情况下等待
所以也许这样更好:
public async Task SendMessage(string msg, CancellationToken ct)
您怎么看?
答案 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保持为 方法接受的最后一个参数。这非常适合可选 参数无论如何,因为他们必须在任何需要之后出现 参数。
答案 1 :(得分:0)
是的,如果您希望调用者始终通过CancelationToken,则必须使用显式参数强制它:
public async Task SendMessage(string msg, CancellationToken ct)
原因是,来电者可以通过CancellationToken.None
,但这不是您的选择。您创建需要CancellationToken
的“合同”。