Я использую приведенный ниже код для загрузки нескольких вложений с сервера 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);
}
Я хочу загрузить несколько файлов с помощью DownloadFileAsync, но я хочу, чтобы они загружались по одному.
Кто-то может спросить: «Почему бы вам просто не использовать синхронный метод DownloadFile?» Это потому что:
- Я хочу использовать события, предоставляемые DownloadFileAsync.
- Я не хочу создавать несколько экземпляров Web-клиента, чтобы избежать переполнения сервера.
Это решение, о котором я подумал:
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);
}
}
Однако у этого подхода есть пара проблем:
- Thread.Sleep () блокирует мою форму. Мне все еще нужно сделать свой собственный поток или использовать BackgroundWorker. (Я хотел бы избежать этого в максимально возможной степени)
- Событие DownloadFileCompleted запускается после загрузки ALL файлов. Я не знаю, является ли это побочным эффектом использования System.Threading.Thread.Sleep (1000);
Есть ли лучший подход для загрузки файлов по одному с помощью WebClient.DownloadFileAsync?
Спасибо!