【发布时间】:2017-08-16 10:44:30
【问题描述】:
我正在尝试从 URL 下载文件,我必须在 WebClient 和 HttpClient 之间进行选择。我参考了this 文章和互联网上的其他几篇文章。由于其出色的异步支持和其他 .Net 4.5 特权,建议在任何地方使用 HttpClient。但我仍然不完全相信,需要更多的投入。
我正在使用以下代码从互联网下载文件:
网络客户端:
WebClient client = new WebClient();
client.DownloadFile(downloadUrl, filePath);
HttpClient:
using (HttpClient client = new HttpClient())
{
using (HttpResponseMessage response = await client.GetAsync(url))
using (Stream streamToReadFrom = await response.Content.ReadAsStreamAsync())
{
}
}
从我的角度来看,我只能看到使用 WebClient 的一个缺点,那就是非异步调用,阻塞了调用线程。但是如果我不担心线程阻塞或使用client.DownloadFileAsync() 来利用异步支持怎么办?
另一方面,如果我使用 HttpClient,我不是将文件的每个字节都加载到内存中,然后将其写入本地文件吗?如果文件太大,内存开销会不会很贵?如果我们使用 WebClient 可以避免这种情况,因为它会直接写入本地文件而不消耗系统内存。
那么,如果性能是我的首要任务,我应该使用哪种方法进行下载?如果我的上述假设是错误的,我想澄清一下,我也愿意接受其他方法。
【问题讨论】:
-
"使用WebClient的缺点...非异步调用,阻塞调用线程" 所以使用
DownloadFileAsync。 -
WebClient 已过时 sincd 2012 并且两个 sn-ps 正在做不同的事情。您可以使用HttpClient.GetStreamAsync 在一行中获取文件流,然后使用
.CopyToAsync()将流的内容复制到文件流 -
@KennethK。你可能是指DownloadFileTaskAsync。较旧的 DownloadFileAsync 使用事件来通知下载完成,它不是现在使用的意义上的异步
标签: c# .net rest httpclient webclient