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,因为这是一个控制台应用程序,我知道最好在事件处理程序中等待结果。
这是由于使用语句引起的吗?
是的。在这两个代码示例中,你将在操作完成之前释放基础客户端。这两个代码示例都应更改如下:
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);
}
}
异步下载在释放其基础客户端时的行为未记录。最好不要释放客户端,直到代码使用完它们。