Проблема повторного использования DownloadFile внутри BackgroundWorker - PullRequest
0 голосов
/ 06 октября 2011

У меня есть простой класс:

public class DownloadFile
{
    ...

    public string GetFile(string fileUrl, string pathOut)
    {
        using (WebClient wc = new WebClient())
        {
            wc.DownloadFile(new Uri(fileUrl), pathOut);
            return pathOut;
        }
    }
}

, который я вызываю из BackgroundWorker 2 раза, поскольку процесс состоит в том, чтобы загрузить и установить 2 файла (здесь выполняется собственный установщик).

Проблема в том, что первый файл загружается и устанавливается нормально, но 2-й файл зависает в строке wc2.DownloadFile(new Uri(fileUrl), pathOut); и никогда не выходит оттуда !

с использованием using IЯ избавляюсь от WebClient каждый раз, когда использую, так что я могу сказать:

// Created BackgroundWorker so the UI doesn't get blocked and I can
//   can show the progress in a log...
BackgroundWorker bkWrk = new BackgroundWorker();
bkWrk.WorkerReportsProgress = true;
bkWrk.ProgressChanged += (s, e) =>
{
    ReportProgress(String.Format("Progress: {0}%", e.ProgressPercentage));
};
bkWrk.DoWork = delegate {

    DownloadFile fileManager = new DownloadFile();

    fileManager.GetFile("http://domain.com/file_A.zip", "C:\\TEMP\\file_a.zip");
    fileManager.GetFile("http://domain.com/file_B.zip", "C:\\TEMP\\file_b.zip");
};
bkWrk.RunWorkerAsync();

while(bkWrk.IsBusy)
{
    // let's wait but fire all events 
    Application.DoEvents();
}

Я не вижу здесь никакой проблемы ... но правда в том, что файл зависает на методе DownloadFileЯ даже безуспешно пытался использовать Microsoft Symbols для навигации по методу.

Даже добавил заголовок к запросу, но проблема остается

wc.Headers["User-Agent"] = "Mozilla/4.0 (Compatible; Windows NT 5.1; MSIE 6.0)" +
                           " (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";

Я что-то упускаю из видуздесь

1 Ответ

0 голосов
/ 06 октября 2011

DownloadFile fileManager = new DownloadFile (); fileManager.GetFile ( "http://domain.com/file_A.zip", "C: \ TEMP \ file_a.zip"); fileManager.GetFile ( "http://domain.com/file_B.zip", "C: \ TEMP \ file_b.zip");

Вы понимаете, что wc.DownloadFile не является методом Async, верно? Это означает, что ваш фоновый работник должен загрузить первый файл, затем второй файл, прежде чем его работа будет завершена.

это делает ... большая проблема, это то, что иногда он загружает оба файла без проблем: - / -

Это просто означает, что вы достаточно долго ждали завершения обоих действий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...