C#async-await如何处理长操作?

Ole*_* Sh -3 c# async-await

我的服务中有以下代码:

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

        // verify domain on Office365
        await _office365domainService.VerifyDomainAsync(domain);
Run Code Online (Sandbox Code Playgroud)

第一个操作是呼叫端点#1(域名管理员)并将TXT记录添加到域.第二个操作是呼叫端点#2(Office365),它验证域regIOS中是否存在TXT记录.

这段代码不起作用,我在第二次操作时遇到异常,TXT记录不存在.

我创建了测试代码:

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

    public IActionResult Test()
    {
        return Ok();
    }
Run Code Online (Sandbox Code Playgroud)

并称之为:

        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");
        }
Run Code Online (Sandbox Code Playgroud)

它按预期工作,调用第一种方法,等待10秒,同时执行"LongOperation",然后调用"Test"方法.

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

小智 6

你甚至可能没有async-await的问题.

第一个操作执行async并等待,但这是DNS配置更改 - 由于多个DNS缓存层,它可能在几分钟内不可见办公室365.这里错误的假设是:

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

通常对于像DNS这样的东西,您可能希望每隔15秒重试一次并在一段时间后放弃,或者使用处理更长时间的工作流程.这不是async/await相关 - 它与服务器延迟交付的电子邮件相同.它是协议的一部分.