C # HttpClient ReadAsStreamAsync - PullRequest
       21

C # HttpClient ReadAsStreamAsync

0 голосов
/ 18 марта 2019

У меня проблема с загрузкой 400 МБ + файла с использованием C # HttpClient ReadAsStreamAsync - проблема в том, что из 427724800 считывается только около 213864187 байт, а затем

read = await stream.ReadAsync(buffer, 0, buffer.Length, token)

продолжает возвращать 0 без видимой причины.

У кого-нибудь была похожая проблема?

using (var stream = await response.Content.ReadAsStreamAsync()) {
    var totalRead = 0L;
    var buffer = new byte[4096];                            
    var moreToRead = true;

    const int CHUNK_SIZE = 4096;
    var fileStream = File.Create(filename, CHUNK_SIZE);                            
    int bytesRead;
        do {
        token.ThrowIfCancellationRequested();

        var read = await stream.ReadAsync(buffer, 0, buffer.Length, token);

        if (read == 0) {
            moreToRead = false;
            this.Percentage = 100;
            if (fileStream != null) {
                    fileStream.Close();
                    fileStream.Dispose();
                }
        } else {
            var data = new byte[read];
            buffer.ToList().CopyTo(0, data, 0, read);
            bytesRead = stream.Read(buffer, 0, CHUNK_SIZE);
            if (bytesRead > 0) {                                       
                fileStream.Write(buffer, 0, bytesRead);
            }                                    
            // Update the percentage of file downloaded
            totalRead += read;

            if (canReportProgress) {
                var downloadPercentage = ((totalRead * 1d) / (total * 1d)) * 100;
                var value = Convert.ToInt32(downloadPercentage);
                this.Percentage = value;
                this.BytesReceived = totalRead;
            }
        }
    }
    while (moreToRead);                           
}

1 Ответ

4 голосов
/ 18 марта 2019

Вокруг этого бита происходит что-то странное:

buffer.ToList().CopyTo(0, data, 0, read);
bytesRead = stream.Read(buffer, 0, CHUNK_SIZE);
if (bytesRead > 0) {                                       
    fileStream.Write(buffer, 0, bytesRead);
} 

Я ожидаю, что вы запишете только что прочитанные байты в fileStream - т.е. fileStream.Write(buffer, 0, read) самостоятельно.Однако вы копируете буфер в массив data (который больше никогда не используется), затем читаете из потока снова в buffer (на этот раз синхронно) и записываете , что ,

Итак, вы выбрасываете половину загруженных байтов.Неудивительно, что из 427724800 считывается только около 213864187 байт!

Кроме того, используйте using блок для вашего fileStream, а не явный вызов .Dispose().Кроме того, если вы копируете один массив в другой, используйте Array.Copy вместо array.ToList().CopyTo(...).

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