Asp.net-Core-Signalr
SignalR Core 中的 SendAsync 和 SendCoreAsync 方法之間的區別?
當更新到最新版本的 ASP Net Core 和 SignalR 核心時,我注意到它們是向客戶端發送方法時可用的兩種“發送”方法(以前是 InvokeAsync)。
看了程式碼註釋,兩個方法在註釋上是一樣的,都是繼承自IClientProxy,都接受字元串方法,對象args,然後是取消token。
這些方法有什麼區別?如果有的話?什麼時候應該使用?
@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);