Поиск…


Использование BackgroundWorker

Выполнение задачи с фоновым работником.

Дважды щелкните элемент управления BackgroundWorker из панели инструментов

Управление BackroundWorker в панели инструментов

Вот как появляется BackgroundWorker после его добавления.

введите описание изображения здесь

Дважды нажмите на добавленный элемент управления, чтобы получить событие BackgroundWorker1_DoWork и добавьте код, который будет выполняться при вызове BackgroundWorker. Что-то вроде этого:

Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork

    'Do the time consuming background task here

End Sub

Вызов BackgroundWorker для выполнения задачи можно выполнить в любом случае, например Button_Click , Textbox_TextChanged и т. Button_Click , Textbox_TextChanged образом:

BackgroundWorker1.RunWorkerAsync()

Измените событие RunWorkerCompleted чтобы зафиксировать завершенное задание задачи BackgroundWorker следующим образом:

Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    MsgBox("Done")
End Sub

Появится окно с сообщением « Done когда работник завершает назначенную ему задачу.

Доступ к компонентам GUI в BackgroundWorker

Вы не можете получить доступ к компонентам GUI из BackgroudWorker. Например, если вы попытаетесь сделать что-то подобное

Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs)
    TextBox1.Text = "Done"
End Sub

вы получите сообщение об ошибке времени выполнения, в котором говорилось, что «операция поперечного потока недействительна: элемент управления« TextBox1 »доступен из потока, отличного от потока, в котором он был создан».

Это связано с тем, что BackgroundWorker запускает ваш код в другом потоке параллельно с основным потоком, а компоненты GUI не являются потокобезопасными. Вы должны установить свой код для запуска в основном потоке с помощью метода Invoke , предоставив ему делегат:

Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs)
    Me.Invoke(New MethodInvoker(Sub() Me.TextBox1.Text = "Done"))
End Sub

Или вы можете использовать метод ReportProgress для BackgroundWorker:

Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs)
    Me.BackgroundWorker1.ReportProgress(0, "Done")
End Sub

Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As ProgressChangedEventArgs)
    Me.TextBox1.Text = DirectCast(e.UserState, String)
End Sub


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow