与httpClient

时间:2018-01-31 16:42:59

标签: c# network-programming async-await dotnet-httpclient

我从这个网站(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();

但它没有下载任何文件,它实际上从未完成下载。

此代码有什么问题?

EDIT1

答案是僵局,但我不知道它已经陷入僵局,所以感谢让我知道我的代码已经陷入僵局,我现在已经理解并可以修复它。

这不是另一个问题的副本,因为我不知道为什么它不起作用,我知道,答案会帮助我

2 个答案:

答案 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#?