2010-05-13 7 views
2

SelonWebClient.OpenFileAsync feu DownloadProgressChanged

http://msdn.microsoft.com/en-us/library/system.net.webclient.downloadprogresschanged.aspx,

OpenFileAsync aurait dû DownloadProgressChanged tir chaque fois qu'il fait des progrès.

Je ne peux pas le tirer du tout. Fires bien avec DownloadDataAsync et DownloadFileAsync à la place cependant.

Voici un exemple simple:

using System; 
using System.Net; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      WebClient client = new WebClient(); 
      client.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted); 
      client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged); 
      client.OpenReadAsync(new Uri("http://www.stackoverflow.com")); 
      Console.ReadKey(); 
     } 

     static void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) 
     { 
      Console.WriteLine("{0}% Downloaded", e.ProgressPercentage); 
     } 

     static void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) 
     { 
      Console.WriteLine("Open Read Completed"); 
     } 
    } 
} 

Pour moi, l'événement DownloadProgressChanged ne se déclenche jamais, bien que le changement de DownloadFileAsync ou DownloadDataAsync et il le fait.

+0

J'ai effectivement des résultats différents (avec .Net4). Avec mes tests, DownloadProgressChanged se déclenche parfaitement lors de l'utilisation de DownloadDataAsync(). Mais si j'essaie d'utiliser DownloadFileAsync(), il ne se déclenchera pas du tout! :/ –

+0

Dans le cas où quelqu'un d'autre se heurte à cela, DownloadFileAsync() renvoie void donc il n'y a aucun moyen de savoir si elle se heurte à une erreur autant que je peux dire. Dans mon cas, je n'ai pas créé le répertoire où je téléchargeais. Cela a provoqué l'erreur de la méthode et n'a déclenché aucun des événements. Après avoir créé le dossier de téléchargement où mon fichier était en cours de téléchargement, cela fonctionne comme prévu. –

Répondre

1

J'ai regardé la source d'infrastructure et autant que je peux dire l'OpenReadAsync ne touche jamais le truc qui déclenche DownloadProgressChanged.

Il n'appelle pas GetBytes comme DownloadDataAsync et DownloadFileAsync do, ce qui, à son tour, semble déclencher l'événement.

Pour contourner cela, je viens d'utiliser DownloadDataAsync à la place, ce qui déclenche l'événement et me permet de fournir des commentaires sur l'interface utilisateur pour le téléchargement. Il renvoie un tableau d'octets au lieu du flux dont j'avais besoin, mais ce n'est pas un problème. Donc, je suppose que c'est MSDN qui ne va pas ici, et OpenReadAsync ne déclenche pas DownloadProgressChanged.

+0

Oui, c'est ce que je vous ai dit dans ma réponse. Revendiquer la réponse vous-même et downvoting le mien n'est certainement pas l'esprit de ce site Web. Cela fait un charlatage comme une violation de la clause «attribution requise» dans la licence de ce site. Je vais demander à un modérateur de jeter un coup d'œil. –

+0

Désolé, vous vous sentez comme ça, excuses si j'ai fait quelque chose de mal. Je suppose que je n'ai peut-être pas assez bien formulé la question. C'était vraiment un cas de "est-ce que je deviens fou ici ou est-ce que MSDN est en train de griffonner?" –