C # Как async-await работает с длинными операциями? - PullRequest
0 голосов
/ 16 января 2019

У меня есть следующий код в моем сервисе:

        // add Txt record to DNSimple with verification text
        await CreateDomainRecordAsync(domain, new DomainRecordDto
        {
            //....
        });

        // verify domain on Office365
        await _office365domainService.VerifyDomainAsync(domain);

Если первая операция - это вызов конечной точки № 1 (регистратор домена) и добавление записи TXT в домен. Вторая операция - это конечная точка вызова № 2 (Office365), которая проверяет, существует ли запись TXT в регистраторе домена.

Этот код не работает, я получаю исключение во второй операции, что TXT-запись не существует.

Я создал тестовый код:

    public IActionResult LongOperation()
    {
        Thread.Sleep(10 * 1000);
        return Ok();
    }

    public IActionResult Test()
    {
        return Ok();
    }

и назовите это:

        using (HttpClient httpClient = new HttpClient())
        {
            httpClient.BaseAddress = new Uri("http://test***.azurewebsites.net/home/");
            await httpClient.GetAsync("LongOperation");
        }

        using (HttpClient httpClientLocal = new HttpClient())
        {
            httpClientLocal.BaseAddress = new Uri("https://localhost:44366/Home");
            await httpClientLocal.GetAsync("Test");
        }

Работает, как я и ожидал, сначала вызовите метод, подождите 10 секунд, пока выполняется LongOperation, а затем вызовите метод Test.

Почему мой реальный код с доменами не ждет и как это правильно сделать?

1 Ответ

0 голосов
/ 16 января 2019

У вас может даже не быть проблем с async-await.

Первая операция выполняется асинхронно, и вы ждете, но это изменение конфигурации DNS - он может не отображаться в Office 365 в течение нескольких минут благодаря нескольким слоям кэширования DNS. Неправильное предположение здесь таково:

  • Изменения DNS видны сразу
  • Это проблема асинхронного ожидания / ожидания.

Как правило, для таких вещей, как DNS, вы можете повторить попытку каждые 15 секунд и отказаться через некоторое время или использовать рабочий процесс, который обрабатывает более длительные периоды времени. Это не связано с асинхронностью / ожиданием - это то же самое, что и с электронными письмами, когда сервер может задержать доставку. Это часть протокола.

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