Могу ли я опустить «ожидание» для Clients.All.SendAsyn c () в. NET Core SignalR? - PullRequest
0 голосов
/ 18 июня 2020
        public async Task GetLiveCandleStick(string param)
        {
            await Clients.All.SendAsync("ReceiveMessage", param);
        }

Обратите внимание на приведенный выше код.

Практически все методы await Clients.xxx.SendAsync в руководстве. Однако я считаю, что он отлично работает, даже если я убрал ключевое слово await. Тогда какой смысл использовать await? (Я видел поток, в котором объяснялось, что await не означает «ждать, пока клиент получит сообщение ...»)

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 18 июня 2020

Только в этом случае вам не нужно использовать await - после SendAsync больше ничего не происходит, поэтому ждать не нужно. Ожидание на GetLiveCandleStick будет вести себя так же, как ожидание на SendAsync. Вы можете преобразовать этот метод в:

public Task GetLiveCandleStick(string param)=> Clients.All.SendAsync("ReceiveMessage", param);

Учебники используют await, потому что довольно часто - это код после SendAsync, который должен выполняться после того, как SignalR поставит сообщение в очередь.

Вы можете захотеть добавить обработку ошибок в случае, если SignalR выдает, например, или обеспечить постановку сообщения Begin в очередь после сообщения End в закрытом l oop. Наличие await даже для метода с одним оператором может быть полезно и для отладки.

Наконец, в хороших руководствах не следует вводить несвязанные концепции, поскольку это может легко привести к путанице. Учебник по SignalR - не лучшее место для объяснения конечного автомата await или того, когда await можно пропустить. К сожалению, слишком много примеров в docs.microsoft.com пытаются поместить все на одну страницу, что приводит к некоторой путанице.

3 голосов
/ 18 июня 2020

Если опустить ключевое слово await, метод станет «запустил и забыл»; это почти никогда не бывает правильным, поскольку у вас не будет возможности узнать, что Task завершился.

Другая проблема - обработка исключений. Если при вызове SendAsync возникает исключение, оно помещается в Task, а не выбрасывается напрямую, и будет просто сборщиком мусора без использования await.

Сказав это, если ваш GetLiveCandleStick - это простая оболочка, как вы предлагаете, было бы немного эффективнее просто вернуть Task из SendAsync, а не создавать новую, используя async:

public Task GetLiveCandleStick(string param)
{
    return Clients.All.SendAsync("ReceiveMessage", param);
}
0 голосов
/ 18 июня 2020

Ключевое слово "await" предназначено для c асинхронных методов. Это умнее, чем "ждать", это асинхронно c стой! Это означает, что дождитесь возврата сообщения во время выполнения exe c кода, пока результат не будет необходим. Таким образом, вам не нужно использовать Thread.Wait в строке кода, но компилятор помещает ожидание в правильную позицию. В этом случае метод, вызывающий ожидание, имеет вид asyn c, поэтому ожидание Clients.All.SendAsyn c не работает.

...