, когда я пытаюсь написать метод, который может сообщать о прогрессе при загрузке файла, и я написал несколько кодов:
public static async IAsyncEnumerable<(long current, long total)> Download()
{
var client = new HttpClient();
using var response = await client.GetAsync("<img-url>", HttpCompletionOption.ResponseHeadersRead);
await using var fileStream = new FileStream("<filepath>", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);
var contentLength = response.Content.Headers.ContentLength;
if (!contentLength.HasValue)
{
throw new InvalidOperationException("cannot retrieve the content length of the request uri");
}
response.EnsureSuccessStatusCode();
long bytesRead, totalRead = 0L;
var byteBuffer = new byte[1024];
await using var contentStream = await response.Content.ReadAsStreamAsync();
while ((bytesRead = await contentStream.ReadAsync(byteBuffer, 0, byteBuffer.Length).ConfigureAwait(false)) != 0)
{
await fileStream.WriteAsync(byteBuffer);
totalRead += bytesRead;
yield return (totalRead, contentLength.Value);
}
}
использование:
await foreach(var (current, total) in Download())
{
Console.WriteLine($"{current}/{total}")
}
но я нашел некоторые проблемы после запуска этого метода, часть пикселей изображения имеет неправильное смещение по горизонтали, как это , и если я использую HttpClient.GetByteArrayAsync()
, то проблем не будет ,, и я несколько раз пробовал смещение дислокации все появляются в одном месте