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

问题描述 投票:0回答:2

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

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

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

asp.net-core-signalr
2个回答
71
投票

引用

@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);

0
投票

当需要接收数组作为参数时使用SendCoreAsync。

© www.soinside.com 2019 - 2024. All rights reserved.