我有以下代码
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,因为这是一个控制台应用程序,我知道最好等待事件处理程序中的结果。
答案 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);
}
}
处理其基础客户端时异步下载的行为没有记录。在使用它们完成代码之前,最好不要处理客户端。