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

enr*_*7mc 5 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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

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

Ste*_*ary 8

这是由于使用声明引起的吗?

是.在这两个代码示例中,您在操作完成之前处置基础客户端.这两个代码示例都应该这样改变:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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