我从这个网站(https://psycodedeveloper.wordpress.com/2013/04/02/how-to-download-a-file-with-httpclient-in-c/)借用了这段代码:
public static Task DownloadAsync(string requestUri, string filename)
{
if (requestUri == null)
throw new ArgumentNullException("requestUri");
return DownloadAsync(new Uri(requestUri), filename);
}
public static async Task DownloadAsync(Uri requestUri, string filename)
{
if (filename == null)
throw new ArgumentNullException("filename");
using (var httpClient = new HttpClient())
{
using (var request = new HttpRequestMessage(HttpMethod.Get, requestUri))
{
using (Stream contentStream = await (await httpClient.SendAsync(request)).Content.ReadAsStreamAsync(),
stream = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None, 10000, true))
{
await contentStream.CopyToAsync(stream);
}
}
}
}
我称之为:
DownloadAsync(@"http://www.stafforini.com/docs/Covey%20-%20The%207%20habits%20of%20highly%20effective%20people.pdf", @"D:\Temp\test.pdf").Wait();
但它没有下载任何文件,它实际上从未完成下载。
此代码有什么问题?
答案是僵局,但我不知道它已经陷入僵局,所以感谢让我知道我的代码已经陷入僵局,我现在已经理解并可以修复它。
这不是另一个问题的副本,因为我不知道为什么它不起作用,我知道,答案会帮助我
答案 0 :(得分:3)
此代码将在具有同步上下文(除了控制台应用程序之外的大多数环境)的任何环境中死锁,因为它会创建循环等待。
如果你在这样的环境中工作,你应该使用async / await"一直向下。"
有关详细信息,请参阅Stephen Cleary的Don't Block on Async Code。
答案 1 :(得分:1)
此代码仅存储从URL下载的文件。 您必须将数据保存到FileStream中的文件中。
一个简短的例子是John Skeet在这个链接上的答案: How do I save a stream to a file in C#?