【问题标题】:Async method not returning immediately [duplicate]异步方法没有立即返回[重复]
【发布时间】:2014-01-04 05:35:04
【问题描述】:

我正在使用这个解决方案: How to correctly write async method?

但是,异步方法似乎不会立即返回,而是需要一段时间。这里是

class Program
{
    static void Main(string[] args)
    {
        Debug.WriteLine("Calling DoDownload");
        var downloadTask = DoDownloadAsync();
        Debug.WriteLine("DoDownload done");
        downloadTask.Wait(); //Waits for the background task to complete before finishing. 
    }

    private static async Task DoDownloadAsync()
    {
        WebClient w = new WebClient();

        string txt = await w.DownloadStringTaskAsync("http://www.google.com/");
        Debug.WriteLine(txt);
    }
}

“DoDownload Done”正在下载文本之前打印,但需要一段时间(我认为它正在等待下载完全返回打印它。)我做错了什么?

【问题讨论】:

  • @AD.Net 不,他所拥有的是正确的,因为他正在尝试做的事情。
  • @SriramSakthivel 他想要首先打印它。这就是重点。它不是。该文本应该几乎立即出现;这是他所期待的,但他声称事实并非如此。
  • 在返回任务之前,可能有些工作正在同步完成。例如,它可能会在您的 URL 上进行 DNS 查找并创建套接字,仅异步执行套接字发送/接收部分。
  • 我遇到了一些奇怪的行为,有时需要 2 秒,有时需要 11 秒。
  • 对于在没有附加调试器的情况下运行的发布版本,我得到了 30-40 毫秒的延迟。

标签: c# async-await c#-5.0


【解决方案1】:

您的实施和期望是正确的。 WebClient::DownloadStringTaskAsync 在调用实际底层 WebRequest::BeginGetResponse 之前确实有一些同步操作,但很少。我看到的唯一一个仔细阅读可能解释此代理发现/协商的代码。你是不是碰巧背后有代理?

【讨论】:

  • JIT 预热无法解释 a 2-11 second delay。我通常不会有人类感知到的延迟。
  • 啊,我没有看到他提到它需要多长时间,因为它被埋在了 cmets 中。是的,不,JIT 不会解释。
猜你喜欢
  • 1970-01-01
  • 2012-09-05
  • 2014-02-18
  • 1970-01-01
  • 1970-01-01
  • 2018-03-03
  • 2014-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多