Разница между методами SendAsync и SendCoreAsync в SignalR Core?

При обновлении до последней версии ASP Net Core и SignalR core я заметил, что при отправке методов клиенту доступны два метода «отправки» (что раньше было InvokeAsync).

После просмотра комментариев к коду оба метода идентичны в комментариях, оба наследуются от IClientProxy и оба принимают строковый метод, аргументы объекта и затем токен отмены.

В чем отличия этих методов? Если есть? и что использовать, когда?


person FasettoAndy    schedule 30.07.2018    source источник
comment
Вопрос неточный, аргументы, которые они получают, не совпадают.   -  person Andrew    schedule 06.06.2019


Ответы (1)


Цитата @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);

Опять же, будет выбрана перегрузка, которая принимает объект [] (см. Эту иллюстрацию в 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);
person emix    schedule 30.07.2018
comment
Мне нравится ваша длинная короткая реплика! - person michasaucer; 03.06.2020
comment
он говорит, что SencoreAsync не ждет ответа от получателя. это означает, что вам не нужно ждать ответа от клиента и можно завершить запрос? это может дать некоторую производительность? - person Wilmar Arias; 20.04.2021
comment
@WilmarArias SendAsync говорит то же самое - person SteveC; 20.06.2021