переход от синхронного API к асинхронному API - PullRequest
0 голосов
/ 03 апреля 2019

Мне нужно перейти от использования синхронного API к асинхронному API:

    void Client()
    {
        Stopwatch stopWatch = new Stopwatch();
        stopWatch.Start();
        int numAttempts = SendWithRetries();
        stopWatch.Stop();
        Logging.Log(LoggingLevel.Info, string.Format("time taken {0} ", numEvents, partitionId, stopWatch.Elapsed.TotalSeconds.ToString()));

    }

    private int SendWithRetries(int numRetries = 3)
    {
        for (int i = 0; i <= numRetries; i++)
        {
            try
            {
                API();
                return i;
            }
            catch (Exception e)
            {
                if (i == numRetries)
                {
                    throw;
                }
            }
        }
        return -1;
    }

Теперь, чтобы перейти к асинхронному API, я собираю из Интернета, что мне нужно заменить API на

await APIAsync()

Я немного запутался в этом. Когда я добавляю await, это заставит основной поток ждать завершения APIAsync. Чем это отличается от синхронного вызова?

Что если я сделаю следующее изменение и продолжу вызывать API () в методе SendWithRetries:

void Client()
    {
        Task newTask =
            System.Threading.Tasks.Task.Run(() => {
                Stopwatch stopWatch = new Stopwatch();
                stopWatch.Start();
                int numAttempts = SendWithRetries();
                stopWatch.Stop();
                Logging.Log(LoggingLevel.Info, string.Format("### time taken {0} ", numEvents, partitionId, stopWatch.Elapsed.TotalSeconds.ToString()));
            });

        newTask.Wait();
    }

Почему использование асинхронного метода с ожиданием лучше, чем описанный выше подход?

Кроме того, что не так со следующим:

private int SendWithRetries(int numRetries = 3)
    {
        for (int i = 0; i <= numRetries; i++)
        {
            try
            {
                APIAsync();
                return i;
            }
            catch (Exception e)
            {
                if (i == numRetries)
                {
                    throw;
                }
            }
        }
        return -1;
    }

Ответы [ 2 ]

2 голосов
/ 03 апреля 2019

Чем это отличается от синхронного вызова?

Асинхронный код не блокирует вызывающий поток.

Почему используется асинхронный метод сждать лучше, чем описанный выше подход?

Этот подход перемещает блокировку в поток пула потоков (Task.Run).Асинхронный код не блокирует поток пула потоков.

Кроме того, что не так со следующим

Поскольку код игнорирует возвращенный Task, код никогда не сможетзнать, когда вызов API завершен или произошла ошибка.

Дополнительная информация:

0 голосов
/ 03 апреля 2019

Ключевое слово await позволяет приложению ждать, не отвечая на запросы.Пользователь сможет продолжить взаимодействие с приложением, пока ожидаемая операция выполняется в фоновом режиме.Когда операция завершится, по умолчанию в потоке пользовательского интерфейса будет выполнен код после ожидания.

Возможно, вам придется ограничить пользователя от определенных взаимодействий на время ожидаемой операции.Некоторые кнопки или параметры меню лучше отключить, чтобы пользователь не мог инициировать несколько асинхронных операций и вызывал нехватку ресурсов или другие проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...