HttpClient.GetStringAsync和WebClient.DownloadStringAsync之间的区别

时间:2014-12-19 17:31:39

标签: c# webclient asynchttpclient

我有以下代码

static void Main(string[] args)
{
        string url = "http://www.google.com";
        Console.WriteLine(GetUrl(url).Result); // throws TaskCanceledException
        Console.WriteLine(GetUrl2(url).Result);
    }

    public static Task<string> GetUrl(string url)
    {
        using (var client = new HttpClient())
        {
            return client.GetStringAsync(url);
        }
    }

    public static Task<string> GetUrl2(string url)
    {
        using (var client = new WebClient())
        {
            return client.DownloadStringTaskAsync(url);
        }
    }

我正在尝试获取url的字符串,问题是GetUrl方法(使用HttpClient的GetStringAsync)抛出TaskCacelledException,但GetUrl2方法(使用WebClient的DownloadStringTaskAsync)正确运行。这是由于using statement引起的吗?我错过了什么?

编辑。在这个例子中,我在任务上调用Result,因为这是一个控制台应用程序,我知道最好等待事件处理程序中的结果。

1 个答案:

答案 0 :(得分:7)

  

这是由于使用声明造成的吗?

是。在这两个代码示例中,您在操作完成之前部署底层客户端。这两个代码示例都应该这样改变:

public static async Task<string> GetUrlAsync(string url)
{
    using (var client = new HttpClient())
    {
        return await client.GetStringAsync(url);
    }
}

public static async Task<string> GetUrl2Async(string url)
{
    using (var client = new WebClient())
    {
        return await client.DownloadStringTaskAsync(url);
    }
}

处理其基础客户端时异步下载的行为没有记录。在使用它们完成代码之前,最好不要处理客户端。