Индикатор выполнения для ImageStream не показывает значения от 0 до 1 - PullRequest
0 голосов
/ 25 июня 2019

У меня есть индикатор загрузки изображения в моем приложении ASP.NET. В цикле while находится следующий код, в котором я делю длину байтов текущего потока на ожидаемый поток, чтобы получить желаемый прогресс:

if (ExpectedStreamSize.HasValue && _configSize.HasValue)
{
    var expected = ExpectedStreamSize + _configSize.Value;
    var progress = _stream.ReadPosition / (float) expected;
    var limitedProgress = progress > 1 ? 1 : progress;

    var epsilon = 0.001;
    if (!_lastReportedProgress.HasValue || _lastReportedProgress.Value + epsilon < limitedProgress)
        _onProgressChanged?.Invoke(limitedProgress);

    _lastReportedProgress = limitedProgress;
    LogToFile(limitedProgress);     // Logged to see the values
}

Однако я ожидаю значения от 0 to 1. Так от 0% до 100%. При отладке я получаю следующие значения:

ExpectedStreamSize.HasValue = true
_configSize.HasValue = 1714

ExpectedStreamSize = 8700000     // 8.7 MB
_configSize.Value = 1714
--> expected: 8701714

_stream.ReadPosition = 1722
expected: 8701714   
--> progress = 0.000197892048

Я зарегистрировал значения для LimitedProgress , которые являются следующими:

0,000197892
0,0001981219
0,0001983517
...
0,0004684135

Но мне нужны значения от 0,00019xxxx до 1,0 (чтобы я достиг 100%).

Может кто-нибудь объяснить мне, что я делаю неправильно и как получить правильный статус прогресса?

1 Ответ

0 голосов
/ 25 июня 2019

Итак, я сам нашел ошибку и исправил ее.

lastReportedProgress = limitedProgress, конечно, принадлежит в в цикле if, в противном случае это неправильно.

Верхнее решение будетвероятно, сработало, но затраты времени были бы экстремальными, потому что слишком много промежуточных шагов выводятся и запрашиваются здесь.Теперь это работает, и журнал также возвращает значения, которые я себе представил:

0,001000033
0,002000066
...
0,9970638
0,998064
0,9990641

Я также скорректировал значение с плавающей запятой выше, чтобы второе условие в цикле if выглядело лучше.

private float _lastReportedProgress = 0;

// some code 

    if(...)
    {
        if (_lastReportedProgress + epsilon < limitedProgress)
    }
...