当前位置 : 主页 > 网络编程 > net编程 >

.net HttpClient 获得下载进度

来源:互联网 收集:自由互联 发布时间:2023-08-28
.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 获取下载进度有所帮助!如果你有任何疑问,请随时提问。

网友评论