Asp.net-Core-Signalr

SignalR Core 中的 SendAsync 和 SendCoreAsync 方法之間的區別?

  • July 30, 2018

當更新到最新版本的 ASP Net Core 和 SignalR 核心時,我注意到它們是向客戶端發送方法時可用的兩種“發送”方法(以前是 InvokeAsync)。

看了程式碼註釋,兩個方法在註釋上是一樣的,都是繼承自IClientProxy,都接受字元串方法,對象args,然後是取消token。

這些方法有什麼區別?如果有的話?什麼時候應該使用?

@anurseGitHub引用:

長話短說:

除非您真的知道自己在做什麼,否則應該忽略****核心方法。

長話短說:

我們從 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);

引用自:https://stackoverflow.com/questions/51590347