加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-core-signalr – SignalR Core中的SendAsync和SendCoreA

发布时间:2020-12-16 06:40:45 所属栏目:asp.Net 来源:网络整理
导读:当更新到最新版本的ASP Net Core和SignalR核心时,我注意到它们在向客户端发送方法时曾经有两种“发送”方法(曾经是InvokeAsync). 在查看代码注释之后,两个方法在注释中都是相同的,都继承自IClientProxy,并且都接受字符串方法,对象args和取消令牌. 这些方法有
当更新到最新版本的ASP Net Core和SignalR核心时,我注意到它们在向客户端发送方法时曾经有两种“发送”方法(曾经是InvokeAsync).

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

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

解决方法

在 https://github.com/aspnet/SignalR/issues/2239#issuecomment-387854470引用@anurse:

简短的回答是:除非你真的知道你在做什么,否则应该忽略核心方法.

更多背景知识:

我们从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,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,c);

因此,我们不是发送一个数组a,c的单个参数,而是将每个参数作为单独的参数发送.这让用户感到困惑.

所以我们从中删除了params,而是生成了一大堆支持多个参数的扩展方法:

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,arg2 });
// ... etc ...

但是当你有这样的代码时,仍然存在歧义:

public void SendAsync(string method,new object[] { arg1 });

var arg = new object[] { a,c }

Clients.All.SendAsync("method",arg);

同样,将选择带有object []的重载(请参阅SharpLab上的此插图).

因此,我们将一个数组重命名为SendCoreAsync:

public void SendCoreAsync(string method,object arg1) => SendCoreAsync(method,c }

// No ambiguity here!
Clients.All.SendAsync("method",arg);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读