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:
- Je veux utiliser les événements fournis par DownloadFileAsync.
- 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:
- 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)
- 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 lewc.IsBusy
esttrue
l'exécution sera "collé" dans le vide "ne rien faire" des accolades.
Vous devez vous connecter pour publier un commentaire.
Afin de simplifier la tâche, vous pouvez créer séparés liste des pièces jointes:
où liste est privé de champ avec le type Liste<Attachement>.
Après cela, vous devez configurer le client web et commencer le téléchargement du premier fichier:
Votre DownloadFileComplete gestionnaire doit vérifier si tous les fichiers déjà téléchargés et de les appeler DownloadFileAsync de nouveau:
Ce code n'est pas une solution optimale. C'est juste une idée.
Au risque de sonner comme un idiot, cela a fonctionné pour moi:
Où
client
est une instance d'uneWebClient
objet.Je pense que cela devrait utiliser la File d'attente