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
등과 같은 모든 이벤트에서 다음과 같이 수행 할 수 있습니다.
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
하면 Done
알리는 메시지 상자가 표시됩니다.
BackgroundWorker에서 GUI 구성 요소에 액세스
BackgroudWorker에서 GUI 구성 요소에 액세스 할 수 없습니다. 예를 들어, 다음과 같이하려고하면
Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs)
TextBox1.Text = "Done"
End Sub
"크로스 스레드 작업이 유효하지 않습니다 : Control '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
또는 BackgroundWorker의 ReportProgress 메서드를 사용할 수 있습니다.
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