HttpClient.GetStringAsync 和 WebClient.DownloadStringAsync 之间

本文关键字:DownloadStringAsync 之间 WebClient GetStringAsync HttpClient | 更新日期: 2023-09-27 18:34:47

>我有以下代码

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,因为这是一个控制台应用程序,我知道最好在事件处理程序中等待结果。

HttpClient.GetStringAsync 和 WebClient.DownloadStringAsync 之间

这是由于使用语句引起的吗?

是的。在这两个代码示例中,你将在操作完成之前释放基础客户端。这两个代码示例都应更改如下:

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);
    }
}

异步下载在释放其基础客户端时的行为未记录。最好不要释放客户端,直到代码使用完它们。

相关文章:
  • 没有找到相关文章