Heim >Backend-Entwicklung >C++ >Wie implementiert man einen Fortschrittsbalken mit HttpClient in .NET?
Die in .NET 4.5 eingeführte IProgress<T>
-Schnittstelle ermöglicht die Handhabung asynchroner Fortschrittsberichte und implementiert so die Fortschrittsbalkenfunktionalität zum Herunterladen von Dateien mit HttpClient.
IProgress<T>
Erstellt eine Erweiterungsmethode für den DownloadAsync
-Vorgang von HttpClient, die eine IProgress<float>
-Implementierung als Parameter akzeptiert. Diese Implementierung aktualisiert den Fortschrittsbalken oder die Benutzeroberfläche mit dem Download-Status.
<code class="language-csharp">public static async Task DownloadAsync(this HttpClient client, string requestUri, Stream destination, IProgress<float> progress = null, CancellationToken cancellationToken = default) { // 首先获取 http 头信息以检查内容长度 using (var response = await client.GetAsync(requestUri, HttpCompletionOption.ResponseHeadersRead)) { var contentLength = response.Content.Headers.ContentLength; using (var download = await response.Content.ReadAsStreamAsync(cancellationToken)) { // 未传递进度报告器或内容长度未知时忽略进度报告 if (progress == null || !contentLength.HasValue) { await download.CopyToAsync(destination); return; } // 将绝对进度(已下载字节数)转换为相对进度(0% - 100%) var relativeProgress = new Progress<long>(totalBytes => progress.Report((float)totalBytes / contentLength.Value)); // 使用扩展方法在下载时报告进度 await download.CopyToAsync(destination, 81920, relativeProgress, cancellationToken); progress.Report(1); // 报告100%完成 } } }</code>
Bei dieser Methode übergibt die progress.Report()
-Methode den aktuellen Download-Fortschritt (in Prozent) an Ihre IProgress<float>
-Implementierung, sodass diese den Fortschrittsbalken oder andere UI-Elemente entsprechend aktualisieren kann.
Um tatsächliche Fortschrittsberichte zu verarbeiten, während Daten in den Zielstream geschrieben werden, sollten Sie die Erstellung einer Erweiterungsmethode für die Stream-Klasse in Betracht ziehen.
<code class="language-csharp">public static async Task CopyToAsync(this Stream source, Stream destination, int bufferSize, IProgress<long> progress = null, CancellationToken cancellationToken = default) { if (source == null) throw new ArgumentNullException(nameof(source)); if (!source.CanRead) throw new ArgumentException("必须可读", nameof(source)); if (destination == null) throw new ArgumentNullException(nameof(destination)); if (!destination.CanWrite) throw new ArgumentException("必须可写", nameof(destination)); if (bufferSize < 0) throw new ArgumentOutOfRangeException(nameof(bufferSize)); var buffer = new byte[bufferSize]; long totalBytesRead = 0; int bytesRead; while ((bytesRead = await source.ReadAsync(buffer, 0, buffer.Length, cancellationToken).ConfigureAwait(false)) != 0) { await destination.WriteAsync(buffer, 0, bytesRead, cancellationToken).ConfigureAwait(false); totalBytesRead += bytesRead; progress?.Report(totalBytesRead); } }</code>
Diese Erweiterungsmethode überwacht die Anzahl der in den Zielstream geschriebenen Bytes und meldet den Fortschritt mithilfe der übergebenen IProgress<long>
-Implementierung.
Durch die Kombination dieser Erweiterungsmethoden können Sie mit HttpClient problemlos die Fortschrittsbalkenfunktionalität für Dateidownloadvorgänge implementieren.
Das obige ist der detaillierte Inhalt vonWie implementiert man einen Fortschrittsbalken mit HttpClient in .NET?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!