Я создал несколько разных классов, которые включают BackgroundWorker. Обычно я использую компонент BackgroundWorker в форме, который будет открыт во время выполнения задания, а затем я передаю этот экземпляр конструктору моего класса задания.
Вот как может выглядеть ваш класс работы:
Private m_bwMain As BackgroundWorker
Public Sub New(ByVal bwMain As BackgroundWorker)
m_bwMain = bwMain
'additional setup code here
End Sub
Чтобы начать работу, вы должны сделать что-то подобное в обработчике события Click вашей кнопки «Начать загрузку»:
lblStatus.Text = "Initializing ..."
bgwMain.RunWorkerAsync(someFileName)
Я объявляю свой класс задания как закрытый член текущей формы, а затем создаю его экземпляр в событии BackgroundWorker.DoWork. Оттуда вы можете вызвать свой метод для загрузки файла:
Private Sub bgwMain_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgwMain.DoWork
m_oJobEngine = New JobEngine(CType(sender, BackgroundWorker))
m_oJobEngine.DownloadFile(CStr(e.Argument))
End Sub
Чтобы сообщить о прогрессе пользователю, вы можете обрабатывать события, вызванные вашим классом, в основной форме. Вам просто нужно убедиться, что объявление объекта класса задания имеет ключевое слово WithEvents. Из этих обработчиков вы можете вызвать метод ReportProgress в BackgroundWorker. Из ReportProgress вы можете вносить любые необходимые изменения в пользовательский интерфейс, чтобы показать прогресс. Вот пример:
Private Sub m_oJobEngine.DownloadProgress(ByVal bgw as Backgroundworker, ByVal bytesTransferred as Long) Handles m_oJobEngine.DownloadProgress
bgw.ReportProgress(0, bytesTransferred)
End Sub
Private Sub bgwMain_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgwMain.ProgressChanged
lblStatus.Text = CLng(e.UserState).ToString & " bytes transferred."
End Sub
Надеюсь, это поможет.