【问题标题】:Default parameter - CancellationToken默认参数 - CancellationToken
【发布时间】:2017-02-25 16:47:48
【问题描述】:

我使用以下代码:

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

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

所以也许这样更好:

public async Task SendMessage(string msg, CancellationToken ct)

你怎么看?

【问题讨论】:

  • “最好只在你的公共 API 中设置你的 CancellationToken 参数可选(如果你有的话)并将它们作为必需参数保留在其他任何地方." -- 答案并链接到下面答案中提供的文章。

标签: c# .net cancellation cancellation-token


【解决方案1】:

这真的取决于你对方法的实现......看看下面:

可选的 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 中可选(如果有的话)并将它们保留为 其他任何地方都需要参数。 这确实有助于确保 您故意通过所有 你调用的方法(上面的#2)。但当然记得切换到 通过CancellationToken.None 一旦你通过了不 取消。

将 CancellationToken 保留为 您的方法接受的最后一个参数。这非常适合可选 无论如何参数,因为它们必须在任何需要后显示 参数。

取自 MSDN:Recommended patterns for CancellationToken

【讨论】:

    【解决方案2】:

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

    public async Task SendMessage(string msg, CancellationToken ct)
    

    当然,调用者可以传递CancellationToken.None,但这不是你的选择。您创建需要CancellationToken 的“合同”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-14
      • 1970-01-01
      • 2016-01-06
      • 1970-01-01
      • 2010-12-01
      • 2011-08-23
      • 2016-08-30
      相关资源
      最近更新 更多