C# проблема производительности потока файлов при загрузке

Я хочу загрузить файл из ответа GET HTTP REQUEST. Для загрузки потока я использую HttpClient, как этот пример:

using System.Net.Http;
using System.Net.Http.Headers;
using ModernHttpClient;

var exClient = new HttpClient(new NativeMessageHandler());
var request = new HttpRequestMessage(new HttpMethod(method), "https://speed.hetzner.de/10GB.bin");
HttpResponseMessage response = await exClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);
var contentStream = await response.Content.ReadAsStreamAsync();

Я хочу сохранить файл на диск, поэтому использую System.IO.

Сначала я использую этот код:

using IOFile = System.IO.File;

Stream file = IOFile.Open(path, FileMode.Create);
contentStream.CopyTo(file);
file.close;

Но я также хотел получить информацию о прогрессе загрузки, поэтому я переключаюсь на этот код:

using IOFile = System.IO.File;

Stream file = IOFile.Open(path, FileMode.Create);

var buffer = new byte[81920];
int received = 0;
int read = 0;

while ((read = await contentStream.ReadAsync(buffer, 0, buffer.Length)) > 0)
{
    file.Write(buffer, 0, read);

    received += read;

    //progressCallback?.Invoke(received);
}

file.Close();

Моя проблема в том, что время загрузки увеличивается более чем в два раза по сравнению с методом CopyTo (около 30 Мбит / с против ~ 90 для CopyTo).

Чем объясняется эта разница? Как мне приблизиться к производительности CopyTo?

Используйте неасинхронный метод чтения и поместите процедуру загрузки в отдельный поток (Task.Run или новый поток ....)

SushiHangover 10.09.2018 14:29

Я поместил весь код, запрос и запись файла в один и тот же Task.Run, без ReadAsync я все еще не достигаю желаемой скорости, этот метод просто делает скорость загрузки более нестабильной, она сильно варьируется от> 18 до 30 <Мбит

Khorwin 10.09.2018 15:56
2
2
258
0

Другие вопросы по теме