Visual Basic .NET Language
BackgroundWorker
Поиск…
Использование BackgroundWorker
Выполнение задачи с фоновым работником.
Дважды щелкните элемент управления BackgroundWorker
из панели инструментов
Вот как появляется 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