猿问

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”方法。


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


临摹微笑
浏览 131回答 1
1回答

湖上湖

你甚至可能没有异步等待的问题。第一个操作执行异步并且您等待,但这是 DNS 配置更改 - 由于多个 DNS 缓存层,它可能在几分钟内不可见 office 365。这里的错误假设是:DNS 更改立即可见这是一个异步/等待问题。通常对于像 DNS 这样的东西,您可能希望每 15 秒重试一次并在一段时间后放弃,或者采用处理更长超时时间的工作流程。这与异步/等待无关 - 这与服务器可能延迟交付的电子邮件相同。它是协议的一部分。
随时随地看视频慕课网APP
我要回答