Как ждать BackgroundWorker fini sh без получения заморозки пользовательского интерфейса - PullRequest
1 голос
/ 13 января 2020

Я пытаюсь закодировать простой загрузчик файлов. Необходимо скачать 4 или более файлов по одному. Я использовал backgroundWorker, чтобы избежать зависания интерфейса. И я отправил первый URL через переменную.

    Dim  crrDownloading as String
    dim URL1  as String = "https://example.com/download/file1.zip"
    dim URL2  as String = "https://example.com/download/file2.zip"
    dim URL3  as String = "https://example.com/download/file3.zip"
    dim URL4  as String = "https://example.com/download/file4.zip"    

Private Sub DownloadList()

    'Download 1st File
     StartDownload(URL1)

    'Download 2nd File
     StartDownload(URL2)

     ...

End Sub

Private Sub StartDownload(URL)

    If Not bwDownloader.IsBusy Then
            crrDownloading = URL
            bwDownloader.RunWorkerAsync()
    End If

End Sub


Private Sub bwDownloader_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles bwDownloader.DoWork
    'web request code...

    theRequest = WebRequest.Create(crrDownloading)

    'more code...
End Sub

Я хочу загрузить следующие файлы после backgroundworker загрузки текущего файла. Как правильно ждать выполнения задачи backgroundworker to fini sh там?

1 Ответ

2 голосов
/ 13 января 2020

Хорошо понимать, что на самом деле здесь происходит. BackgroundWorker не загружает никаких файлов. Все, что делает BackgroundWorker, это вызывает событие в фоновом потоке. Вы должны обработать это событие, и тогда любой код, который вы поместите в свой обработчик события, будет выполнен в этом фоновом потоке. Обработчик событий в вашем коде является частью вашей формы, поэтому загружает файлы ваша форма, а не BackgroundWorker.

Если вы собираетесь придерживаться BackgroundWorker, тогда у вас будет два варианта , Либо вы будете загружать файлы последовательно, один за другим, либо загружать их параллельно, для чего потребуется один BackgroundWorker на файл. Использование нескольких BackgroundWorkers немного громоздко, но хорошо, что вы можете использовать один и тот же метод для обработки всех событий DoWork. Вы просто передадите URL, когда позвоните RunWorkerAsync. Если вы просто используете один BackgroundWorker, то напишите метод, который выполняет одну загрузку, а затем вызовите его четыре раза.

При этом, вероятно, лучше go с параметром Task, предложенным в комментарии.

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