C# загрузка файла с использованием байтового буфера приведет к странному поведению - PullRequest
0 голосов
/ 08 марта 2020

, когда я пытаюсь написать метод, который может сообщать о прогрессе при загрузке файла, и я написал несколько кодов:

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(), то проблем не будет ,, и я несколько раз пробовал смещение дислокации все появляются в одном месте

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...