SignalR Core中的SendAsync和SendCoreAsync方法之间的区别?

时间:2018-07-30 09:00:19

标签: asp.net-core-signalr

当更新到最新版本的ASP Net Core和SignalR Core时,我注意到当向客户端发送方法(以前称为InvokeAsync)时,它们是两个可用的“发送”方法。

查看代码注释后,这两种方法的注释都相同,都继承自IClientProxy,并且都接受字符串方法,对象args和取消标记。

这些方法有什么区别?如果有的话什么时候应该使用?

1 个答案:

答案 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);