Я хочу загрузить файл из ответа 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, без ReadAsync я все еще не достигаю желаемой скорости, этот метод просто делает скорость загрузки более нестабильной, она сильно варьируется от> 18 до 30 <Мбит
Используйте неасинхронный метод чтения и поместите процедуру загрузки в отдельный поток (Task.Run или новый поток ....)