当更新到最新版本的ASP Net Core和SignalR Core时,我注意到当向客户端发送方法(以前称为InvokeAsync)时,它们是两个可用的“发送”方法。
查看代码注释后,这两种方法的注释都相同,都继承自IClientProxy,并且都接受字符串方法,对象args和取消标记。
这些方法有什么区别?如果有的话什么时候应该使用?
答案 0 :(得分:5)
在https://github.com/aspnet/SignalR/issues/2239#issuecomment-387854470处引用@anurse
:
简单的答案是:除非您真的知道自己在做什么,否则应该忽略Core方法。
更多背景信息
我们从SendAsync开始,它需要发送一组参数:
public void SendAsync(string method, object[] args);
Clients.All.SendAsync("Method", new object[] { arg1, arg2, arg3 });
显然,每次都必须创建一个数组很痛苦。最简单的解决方法是使用params:
SendAsync public 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);