.NET HttpClient 获得下载进度 在现代的应用程序开发中,经常需要从互联网上下载文件。在下载大文件时,为了提供更好的用户体验,我们通常需要显示下载进度。在使用 .NET Framework 或
.NET HttpClient 获得下载进度
在现代的应用程序开发中,经常需要从互联网上下载文件。在下载大文件时,为了提供更好的用户体验,我们通常需要显示下载进度。在使用 .NET Framework 或 .NET Core 进行开发时,可以使用 HttpClient 类来下载文件,并通过一些技巧获取下载进度。
使用 HttpClient 下载文件
HttpClient 是 .NET 中用于发送 HTTP 请求的类。通过它,我们可以轻松地从网络上下载文件。下面是一个使用 HttpClient 的简单示例代码:
using System;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;
public class Program
{
public static async Task Main(string[] args)
{
using (HttpClient client = new HttpClient())
{
using (HttpResponseMessage response = await client.GetAsync("
{
if (response.IsSuccessStatusCode)
{
using (Stream stream = await response.Content.ReadAsStreamAsync())
using (FileStream fileStream = File.Create("file.txt"))
{
await stream.CopyToAsync(fileStream);
}
}
}
}
}
}
在上述代码中,我们使用 HttpClient 发送 GET 请求来下载文件。然后,我们将响应的内容流保存到本地文件中。
监听下载进度
获取下载进度的关键是监视响应流的读取过程。我们可以通过创建自定义的内容处理程序来实现这一点,该处理程序在读取数据时会触发进度事件。
下面是一个简单的示例,演示了如何使用自定义的进度消息处理程序来获取下载进度:
using System;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;
public class ProgressHttpContent : HttpContent
{
private readonly HttpContent _content;
private readonly Action<long, long> _progressCallback;
public ProgressHttpContent(HttpContent content, Action<long, long> progressCallback)
{
_content = content;
_progressCallback = progressCallback;
}
protected override bool TryComputeLength(out long length)
{
length = _content.Headers.ContentLength ?? -1;
return true;
}
protected override async Task SerializeToStreamAsync(Stream stream, TransportContext context)
{
var buffer = new byte[4096];
long totalRead = 0;
using (var contentStream = await _content.ReadAsStreamAsync())
{
var totalReadBytes = contentStream.Length;
int read;
while ((read = await contentStream.ReadAsync(buffer, 0, buffer.Length)) != 0)
{
totalRead += read;
_progressCallback(totalRead, totalReadBytes);
await stream.WriteAsync(buffer, 0, read);
}
}
}
}
public class Program
{
public static async Task Main(string[] args)
{
using (HttpClient client = new HttpClient())
{
using (HttpResponseMessage response = await client.GetAsync("
{
if (response.IsSuccessStatusCode)
{
using (Stream stream = await response.Content.ReadAsStreamAsync())
using (FileStream fileStream = File.Create("file.txt"))
{
Action<long, long> progressCallback = (current, total) =>
{
double progress = (double)current / total * 100;
Console.WriteLine($"Download progress: {progress}%");
};
var progressContent = new ProgressHttpContent(response.Content, progressCallback);
await progressContent.CopyToAsync(fileStream);
}
}
}
}
}
}
在上述代码中,我们创建了一个名为 ProgressHttpContent 的自定义内容处理程序。该处理程序在读取数据时调用进度回调函数,并将进度作为百分比显示在控制台上。
结论
在本文中,我们学习了如何使用 .NET HttpClient 类来下载文件,并且通过创建自定义的内容处理程序,使用进度回调函数来获取下载进度。使用这种方法,我们可以为用户提供精确的下载进度信息,以提高用户体验。
希望这篇文章对你理解如何使用 .NET HttpClient 获取下载进度有所帮助!如果你有任何疑问,请随时提问。