C#异步等待如何与长时间操作一起使用?

时间:2019-01-16 16:20:29

标签: c# async-await

我的服务中包含以下代码:

        // 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");
        }

它按预期工作,调用第一个方法,在执行“ LongOperation”时等待10秒钟,然后调用“ Test”方法。

为什么我的带有域的真实代码不等待以及如何正确执行?

1 个答案:

答案 0 :(得分:6)

您甚至可能没有async-await问题。

第一个操作执行异步操作,然后等待,但这是DNS配置更改-由于存在多个DNS缓存层,因此在几分钟内Office 365可能不可见。这里的错误假设是:

  • DNS更改立即可见
  • 这是一个异步/等待问题。

通常,对于DNS之类的东西,您可能希望每隔15秒重试一次,并在一段时间后放弃,或者使用工作时间更长的工作流。这与异步/等待无关,与服务器可能会延迟发送的电子邮件相同。它是协议的一部分。