2010-01-26 13 views
5

J'utilise Webclient pour télécharger des données à l'aide de l'appel Async à un serveur,WebClient AsyncUpload pourcentage de progression revient toujours 50%

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

j'ai joint des événements DatauploadProgress et DatauploadCompleted aux fonctions de rappel appropriées

 // 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); 
    } 

le e.ProgressPercentage renvoie toujours 50 .. peu importe la taille du fichier téléchargé était (essayé différentes tailles entre 10kb à 60mb). la fonction elle-même est appelée seulement deux fois (très vite aussi) et le pourcentage montre 50! ..which est illogique spécialement avec de gros fichiers ...

e.BytesSent n'aide pas non plus .. il montre toujours la taille des fichiers en octets: S (ex: si la taille du fichier était de 63 000, j'obtiendrais e.BytesSent = 63,000 et e.ProgressPercentage= 50

quelqu'un peut-il signaler le problème à moi?

+0

Est-ce que UploadDataAsync supporte réellement la méthode PUT? – jayarjo

Répondre

7

Si vous voulez suivre la progression d'un téléchargement, vous devrez utiliser UploadFileAsync au lieu de UploadData.

Avec UploadDataAsync vous êtes censé couper manuellement le fichier et afficher la progression (au moins, c'est ce que je Je suis déterminé à partir de ma propre expérience en la matière bien que je ne l'ai pas vu écrit en tant que tel sur MSDN).

Ce que vous cherchez est d'utiliser plutôt UploadFileAsync, qui appellera l'événement UploadProgressChanged correctement. Vous pouvez ensuite voir les propriétés des arguments d'événement BytesSent et TotalBytesToSend qui doivent être reflétées correctement.

Je suppose que la raison derrière cela est que lorsque vous envoyez des données, vous pouvez passer en boucle des morceaux de votre flux de données et incrémenter manuellement votre suivi de progression alors qu'avec un fichier que vous ne pouvez pas (.NET gérer l'ensemble téléchargement pour toi). Personnellement, je pense qu'il y a quelque chose de louche parce qu'il n'y a aucune raison pour que l'événement UploadProgressChanged soit appelé avec invalide informations dans le cas de UploadDataAsync - soit il est appelé avec des informations correctes, correctes ou il n'est pas appelé du tout. De toute façon, donnez un coup de feu à UploadFileAsync et voyez comment ça se passe.

+0

+1 pour prendre votre temps pour fournir cette réponse détaillée, je vais le tester et revenir :) –

+1

Thx, testé, et il a résolu le problème: S mais je trouve ça un peu stupide et illogique .. –