WebClient.DownloadFileAsync - Télécharger les fichiers un par un

Je suis en utilisant le code ci-dessous pour télécharger plusieurs pièces jointes à partir d'un serveur TFS:

foreach (Attachment a in wi.Attachments)
{    
    WebClient wc = new WebClient();
    wc.Credentials = (ICredentials)netCred;
    wc.DownloadFileCompleted += new AsyncCompletedEventHandler(wc_DownloadFileCompleted);
    wc.DownloadFileAsync(a.Uri, "C:\\" + a.Name);
}

Je voudrais télécharger plusieurs fichiers à l'aide de DownloadFileAsync, mais je veux qu'ils soient téléchargés un par un.

On peut se demander "Pourquoi ne pas simplement utiliser la machine synchrone DownloadFile méthode?" Sa raison:

  1. Je veux utiliser les événements fournis par DownloadFileAsync.
  2. Je ne veux pas faire de multiples instances de la Webclient pour éviter d'inonder le serveur.

C'est la solution que j'ai pensé:

foreach (Attachment a in wi.Attachments)
{        
    WebClient wc = new WebClient();
    wc.Credentials = (ICredentials)netCred;
    wc.DownloadFileCompleted += new AsyncCompletedEventHandler(wc_DownloadFileCompleted);
    wc.DownloadFileAsync(a.Uri, "C:\\" + a.Name);
    while (wc.IsBusy)
    {
        System.Threading.Thread.Sleep(1000);
    }
}

Cependant, il ya un couple de problèmes avec cette approche:

  1. Le Fil.Sleep() est le blocage de ma Forme. Je dois encore faire mon propre Thread ou l'utilisation BackgroundWorker. (Je voudrais éviter cela autant que possible)
  2. La DownloadFileCompleted événement est déclenché après TOUS fichiers ont été téléchargés. Je ne sais pas si c'est un effet secondaire de l'utilisation du Système.Le filetage.Fil de discussion.Sleep(1000);

Est-il une meilleure approche pour télécharger les fichiers un à un à l'aide WebClient.DownloadFileAsync?

Merci!

  • btw, vous pouvez utiliser System.IO.Path.Combinte("C:", a.Name");
  • Je vais essayer mais certaines réponses sont simplement pas acceptable.
  • Vous pouvez résoudre le blocage du thread problème en faisant ceci: while(wc.IsBusy) { }. De cette façon, aussi longtemps que le wc.IsBusy est true l'exécution sera "collé" dans le vide "ne rien faire" des accolades.
InformationsquelleAutor Ian | 2010-01-11