ожидайте в asyn c метод задачи с синхронными логами c c# - PullRequest
0 голосов
/ 12 февраля 2020

У меня глупый вопрос, чтобы попросить всех изучить некоторые лучшие практики asyn c типы возврата в c#. У меня есть такой метод:

        public virtual async Task OnConnected(WebSocket socket, HttpContext context)
        {
            string connectionId = CreateConnectionId(context);

            ConnectionManager.AddSocket(connectionId, socket);

            //Question is here await what ?

        }

Я хотел бы опубликовать, чтобы улучшить приложение с лучшей производительностью с помощью asyn c и ждать. Просьба не пролистывать мой пост. Кто-нибудь может предложить мне некоторые ресурсы лучшие практики asyn c возвращаемые типы?

Tks каждому.

Ответы [ 3 ]

3 голосов
/ 12 февраля 2020

Изучите некоторые лучшие практики asyn c Типы возврата в c#.

Первое правило async - «не используйте его, если вам не нужно». Второе правило: «начинать с await, а не async».

Так что эта часть вопроса неверна:

// Вопрос здесь, что ждать?

Вместо того, чтобы начинать с async и пытаться «сделать код асинхронным», вы должны начать с противоположного конца: определить, что является естественно асинхронным (то есть, что вы должны сделать await) сначала. Вам нужно что-то await , прежде чем сделать ваш код асинхронным.

Вы должны использовать await, если у вас есть естественная асинхронная работа. Обычно это основано на вводе / выводе, поэтому, если вы вызываете API или выполняете запрос к базе данных, это можно сделать асинхронным. Как только вы определили низкоуровневый вызов ввода / вывода, измените метод для вызова асинхронной версии этого API и добавьте await. Компилятор проведет вас оттуда, изменив метод, содержащий await на async и изменив его тип возврата с void на Task или T на Task<T>. Тогда пусть async / await будут расти естественным образом через вашу кодовую базу .

3 голосов
/ 12 февраля 2020

Если нет ничего для await, и это переопределенный метод. Просто игнорируйте предупреждение компилятора (или pragma отсутствует) и ничего не делайте.

Почему ничего не делаете?

Потому что, когда вы помещаете async в метод, компилятор автоматически помещает Любое исключение по заданию для вас.

или вы можете удалить async и вернуть выполненное задание

public virtual Task OnConnected(WebSocket socket, HttpContext context)
{
   string connectionId = CreateConnectionId(context);

   ConnectionManager.AddSocket(connectionId, socket);

   return Task.CompletedTask;
}

Мой совет будет делать первое (ничего не делать)

Однако, если бы вы использовали go второй подход, было бы лучше поместить любые исключения в возвращаемое задание точно так же, как asyn c и шаблон ожидания .

public virtual  Task OnConnected(WebSocket socket, HttpContext context)
{
   try
   {
      string connectionId = CreateConnectionId(context);

      ConnectionManager.AddSocket(connectionId, socket);

      // more stuff

      return Task.CompletedTask;
   }
   catch (Exception e)
   {
      return Task.FromException(e);
   }   
}
2 голосов
/ 12 февраля 2020

Если у вас нет какой-либо асинхронной операции, которую можно ожидать, тогда вы можете сделать метод как обычный синхронный метод. Если вы делаете метод asyn c, то хорошей практикой будет называть метод так, чтобы он заканчивался на ASYN C, например, OnConnectedAsyn c.

Обычно вы используете async / await методы, когда у вас есть какие-либо операции ввода-вывода (например, доступ к файлу, загрузка / выгрузка через Интернет), которые могут выполняться независимо от логики вашей программы c. Проще говоря, поток управления выглядит так:

  1. основной поток вызывает метод asyn c для запуска операции ввода / вывода
  2. элемент управления возвращается в основной поток после того, как возникнет ожидание ; обычно другой поток отводится для выполнения оставшихся операторов асинхронного c метода
  3. основной поток продолжает выполнять свои операторы до тех пор, пока не потребуется результат операции ввода-вывода
  4. основной поток ожидает результат асинхронного c метода (т. е. результат операции ввода-вывода) путем вызова любого метода wait или GetResult из задачи
  5. , как только основной поток получает результаты, он продолжает выполнять свои операторы

Вы можете go с помощью многочисленных обучающих видео на YouTube по async / await.

...