【问题标题】:C# How async-await works with long operations?C# async-await 如何处理长操作?
【发布时间】:2019-01-17 00:28:07
【问题描述】:

我的服务中有以下代码:

        // 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 秒,然后调用“测试”方法。

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

【问题讨论】:

  • TXT 记录不存在 什么是 TXT 记录?鉴于您的代码,这应该没问题。问题显然在于您尚未共享的一段代码。请为您的问题创建一个Minimal, Complete, and Verifiable example
  • 另外,DNS 记录需要一段时间才能传播。读取可能需要延迟一段时间。
  • @Liam:TXT 记录是一种 DNS 记录。因此,对第一个端点的调用是 OP 通过其域注册商调用端点来设置此记录。我认为该端点的具体调用方式并不重要,因为它是一个异步方法。

标签: c# async-await


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 2020-09-22
    相关资源
    最近更新 更多