代码之家  ›  专栏  ›  技术社区  ›  Oleg Sh

C异步等待如何与长操作一起工作?

  •  -3
  • Oleg Sh  · 技术社区  · 5 年前

    我的服务中有以下代码:

            // 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 回复  |  直到 5 年前
        1
  •  6
  •   TomTom    5 年前

    您甚至可能没有异步等待的问题。

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

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

    一般来说,对于像DNS这样的东西,您可能希望每隔15秒重试一次,并在一段时间后放弃,或者使用处理更长输出时间的工作流。这与异步/等待无关-与服务器可能延迟交付的电子邮件相同。它是协议的一部分。