更新到最新版本的 ASP Net Core 和 SignalR core 时,我注意到向客户端发送方法时有两种可用的“发送”方法(以前是 InvokeAsync)。
查看代码注释后,这两个方法在注释中是相同的,都继承自 IClientProxy,并且都接受字符串方法、对象 args 和取消标记。
这些方法有什么区别?如果有的话?什么时候应该使用哪个?
引用
@anurse
来自GitHub:
长话短说:
核心方法应该被忽略,除非你真的知道你在做什么。
短篇故事长:
我们从 SendAsync 开始,它接受一组参数来发送:
public void SendAsync(string method, object[] args); Clients.All.SendAsync("Method", new object[] { arg1, arg2, arg3 });
显然每次都必须创建一个数组是很痛苦的。简单的 解决这个问题的方法是使用参数:
public void SendAsync(string method, params object[] args); Clients.All.SendAsync("Method", arg1, arg2, arg3);
但是,当您实际上想要将数组作为数组发送时,这就崩溃了 单一参数
public void SendAsync(string method, params object[] args); var arg1 = new object[] { a, b, c }; Clients.All.SendAsync("Method", arg1); // C# 'params' expands this into the below Clients.All.SendAsync("Method", a, b, c);
因此,不要发送一个数组 a、b、c 的单个参数, 我们已将其中每一个作为单独的参数发送。这很令人困惑 用户。
所以我们从中删除了参数,而是生成了一大堆 支持多个参数的扩展方法:
public void SendAsync(string method, object[] args); public void SendAsync(string method, object arg1) => SendAsync(method, new object[] { arg1 }); public void SendAsync(string method, object arg1, object arg2) => SendAsync(method, new object[] { arg1, arg2 }); // ... etc ...
但是当你有这样的代码时仍然存在歧义:
public void SendAsync(string method, object[] args); public void SendAsync(string method, object arg1) => SendAsync(method, new object[] { arg1 }); var arg = new object[] { a, b, c } Clients.All.SendAsync("method", arg);
再次,将选择采用 object[] 的重载(请参阅此 SharpLab 上的插图)。
因此,我们将采用数组的那个重命名为 SendCoreAsync:
public void SendCoreAsync(string method, object[] args); public void SendAsync(string method, object arg1) => SendCoreAsync(method, new object[] { arg1 }); var arg = new object[] { a, b, c } // No ambiguity here! Clients.All.SendAsync("method", arg);
当需要接收数组作为参数时使用SendCoreAsync。