Microsoft.AspNetCore.SignalR SendAsync 参数

Microsoft.AspNetCore.SignalR SendAsync args

有人可以向我解释为什么他们在 AspNetCore.SignalR.SendAsync 方法中使用 arg1, arg2 .... 而不是 params object[] args 吗?

有更好的方法吗?

Screenshot

他们似乎想要 CancellationToken 作为最后一个参数。这是将其作为方法的最后一个参数的常见做法。

await SendAsync(..., arg1, arg2, arg3, cancellationToken);
await SendAsync(..., cancellationToken, arg1, arg2, arg3);

我更喜欢第一行而不是第二行。您只能将 params 用作方法的最后一个参数,这不会让它们将取消标记作为最后一个参数。因此他们决定使用不同数量的参数实现多个重载,这允许他们将 cancellationToken 作为每个重载的最后一个参数。

CancellationToken 是可选的。您会在 documentation 中注意到它被定义为:

System.Threading.CancellationToken cancellationToken = null

(虽然在 actual code 中是 = default,所以我认为文档是错误的)

Optional arguments必须排在最后。

而且,使用带有 params 关键字的无限参数也必须放在最后。所以你不能在同一个方法定义中同时使用两者。

另一种方法是创建方法,将 CancellationToken 作为倒数第二个参数,并在没有它的情况下重载:

public static Task SendAsync (this HubConnection hubConnection, string methodName, params object[] args) {
    return SendAsync(hubConnection, methodName, default, args);
}

public static Task SendAsync (this HubConnection hubConnection, string methodName, CancellationToken cancellationToken, params object[] args) {
    ...
}

这实际上使 CancellationToken 成为可选的。但是,在这种特定情况下,它还会阻止您发送 CancellationToken 作为第一个参数(在 args 数组中)而不是 cancellationToken 参数,如果您需要这样做的话不管出于什么原因。

但是微软也有标准把CancellationToken作为他们写的每一个异步方法的最后一个参数。因此,如果他们这样做,他们就会打破这种模式。所以他们决定只允许 10 arguments.