수색…


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 등과 같은 모든 이벤트에서 다음과 같이 수행 할 수 있습니다.

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


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow