2015-07-04 3 views
0

Я использую System.Net.WebClient для загрузки файла asynchron в моем приложении. По некоторым причинам, в некоторых системах процент вычисляется неправильно.WebClient DownloadFile, отображающий неверный процент

Мой (обновлено) DownloadProgressChanged событие:

WebClient client = new WebClient(); 
client.DownloadProgressChanged += (_sender, _e) => { 
    double bytesIn = _e.BytesReceived; 
    double totalBytes = _e.TotalBytesToReceive; 
    double percentage = bytesIn/totalBytes * 100; 
    UpdateConnectingStatus("Missionsdatei wird heruntergeladen... (" + Math.Truncate(percentage).ToString() + "%)"); 
}; 

Как это должно выглядеть (Windows 8.1 64bit):

How it should look like

Как это выглядит на некоторых системах (Windows 7 64-бит):

How it looks on some systems

Может ли это иметь какое-то отношение к ОС? Или любые другие идеи?

ОБНОВЛЕНИЕ: я удалил подразделение (/ 1000000) полностью, но он не работает ни в одной системе.

ОБНОВЛЕНИЕ 2: Я проверил значение totalBytes. Результат totalBytes равен -1 в системе, где он не работает. Есть идеи, почему это так?

UPDATE 3: У меня все еще нет решения, хотя я попытался удалить материал преобразования строк и добавить в раздел раздел .0. Я думаю, что это зависит от медленного интернет-соединения, которое у человека есть, у которого он не работает. Теперь я показываю процент, если он положительный.

+0

Попробуйте делить на 1000000.0 (с десятичной точкой). Код может выполнять целочисленное разделение и усечение части результатов. Странные результаты - это большое отрицательное число с шестнадцатеричными числами MSB, равными 0xFFFFFF. Похоже, что деление дает целое число вместо float. – jdweng

+0

«Не может ли это иметь какое-то отношение к ОС?» Нет, ошибка принадлежит вам с 99.999999% уверенностью. используйте отладчик, чтобы увидеть, в какой точке значения вычисляются неправильно. Проблема с преобразованием строки funcy может быть проблемой, вы должны удалить это в любом случае. – usr

+1

Если все, что вы показываете, является процентом, почему вы вообще делите на '1000000'? И почему вы используете 'ToString()' и затем разбираете строку? Внесите или преобразуйте его правильно. – Lloyd

ответ

1

Согласно некоторым веб-поискам и в соответствии с моим декомпилятором TotalBytesToReceive может быть -1, если размер загрузки неизвестен (пока). (Да, это отвратительный дизайн API.)

Guard для -1 случая:

if (TotalBytesToReceive == -1) 
Print("Download in Progress"); 
else 
Print(e.ProgressPercent); 

Пока непонятно, почему размер загружаемого файла не известно, на этой одной машине. Возможно, есть HTTP-прокси, удаляющий заголовок Content-Length, или веб-сервер по какой-то причине не отправляет его.

Посмотрите, как легко получить ответы, когда вы предоставите соответствующую информацию?

+1

Да, спасибо! :) – DerAtrox