WebClient. DownloadFileAsync - файлы Загрузки по одному

Я использую код ниже для загрузки нескольких вложений с сервера 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?" Потому что:

  1. Я хочу использовать события, обеспеченные DownloadFileAsync.
  2. Я не хочу делать несколько экземпляров Webclient, чтобы не лавинно рассылать сервер.

Это - решение, о котором я думал:

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

Однако существует несколько проблем с этим подходом:

  1. Поток. Сон () запирает мою Форму. Я все еще должен сделать свой собственный Поток или использовать BackgroundWorker. (Я хотел бы избежать этого как можно больше),
  2. Событие DownloadFileCompleted инициировано после всех файлов был загружен. Я не знаю, является ли это побочным эффектом использования Системы. Поточная обработка. Поток. Сон (1000);

Есть ли лучший подход для загрузки файлов по одному с помощью WebClient. DownloadFileAsync?

Спасибо!

6
задан abatishchev 1 August 2010 в 12:00
поделиться

1 ответ

Чтобы упростить задачу, которую вы можете создать разделенный список вложений:

list = new List<Attachment>(wi.Attachments);

где Список является частным полем с типом Список <Приложение> Отказ После этого вы должны настроить WebClient и начать загрузку первого файла:

if (list.Count > 0) {
   WebClient wc = new WebClient();
   wc.Credentials = (ICredentials)netCred;
   wc.DownloadFileCompleted += new AsyncCompletedEventHandler(wc_DownloadFileCompleted);
   wc.DownloadFileAsync(list[0].Uri, @"C:\" + list[0].Name);
}

Ваш обработчик DownloadFileComplete должен проверить, не все файлы уже загружаются и снова вызовут ShoeFiLeasync:

void wc_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e) {
   // ... do something useful 
   list.RemoveAt(0);
   if (list.Count > 0)
      wc.DownloadFileAsync(list[0].Uri, @"C:\" + list[0].Name);
}

Этот код не является оптимизированным решением. Это просто идея.

8
ответ дан 10 December 2019 в 00:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: