Процент выполнения WebClient AsyncUpload всегда возвращает 50% - PullRequest
5 голосов
/ 26 января 2010

Я использую Webclient для загрузки данных с помощью асинхронного вызова на сервер,

    WebClient webClient = new WebClient();
   webClient.UploadDataAsync(uri , "PUT", buffer, userToken);

Я прикрепил события DatauploadProgress и DatauploadCompleted к соответствующим функциям обратного вызова

        // Upload Date Progress
        webClient.UploadProgressChanged += new 
        UploadProgressChangedEventHandler(UploadProgressCallback);

      // Upload Date Progress
     void UploadProgressCallback(object sender, UploadProgressChangedEventArgs e)
    {
        // Magic goes here 
     logger.writeToLog("Percentage =" + e.ProgressPercentage);
    }

e.ProgressPercentage всегда возвращает 50 .. независимо от размера загруженного файла (пробовал разные размеры от 10 КБ до 60 МБ). сама функция вызывается только дважды (тоже очень быстро), а процент показывает 50! ... что нелогично, особенно с большими файлами ...

e.BytesSent тоже не помогает .. всегда показывает размер файла в байтах: S (например: если размер файла был 63 000, я бы получил e.BytesSent = 63,000 и e.ProgressPercentage= 50

Может кто-нибудь указать мне на проблему?

1 Ответ

7 голосов
/ 26 января 2010

Если вы хотите отслеживать процесс загрузки, вам нужно использовать UploadFileAsync вместо UploadData.

С помощью UploadDataAsync вы должны вручную разбить файл на части и отобразить прогресс (по крайней мере, это то, что я определил по собственному опыту в этом вопросе, хотя я не видел его таковым написанным на MSDN).

Вместо этого вы должны использовать UploadFileAsync, который будет правильно вызывать событие UploadProgressChanged. Затем вы можете просмотреть свойства аргументов событий BytesSent и TotalBytesToSend, которые должны быть правильно отражены.

Я предполагаю, что логическое обоснование этого заключается в том, что при отправке данных вы можете циклически перебирать фрагменты вашего потока данных и вручную увеличивать отслеживание прогресса, тогда как с помощью файла вы не можете (.NET будет управлять целым загрузить для вас). Лично я чувствую, что есть что-то подозрительное, потому что нет причины вызывать событие UploadProgressChanged с неверной информацией в случае UploadDataAsync - либо оно вызывается с действительной, правильной информацией, либо оно вообще не вызывается.

В любом случае, попробуйте UploadFileAsync и посмотрите, как это будет.

...