BackgroundWorker를 통합 한 여러 클래스를 만들었습니다. 내가 일반적으로하는 일은 작업이 수행 될 때 열리는 양식에 BackgroundWorker 구성 요소를 둔 다음 해당 인스턴스를 내 작업 클래스의 생성자에 전달하는 것입니다.
lblStatus.Text = "Initializing ..."
bgwMain.RunWorkerAsync(someFileName)
:
Private m_bwMain As BackgroundWorker
Public Sub New(ByVal bwMain As BackgroundWorker)
m_bwMain = bwMain
'additional setup code here
End Sub
, 당신은 당신의 시작 다운로드 버튼의 클릭 이벤트 처리기에서 같은 것을 할 것입니다 작업을 시작하려면 여기
는 작업 클래스가 어떻게 보이는지이다 내 직업 클래스를 현재 폼의 private 멤버로 선언 한 다음 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 키워드가 있는지 확인해야합니다. 이러한 핸들러에서 BackgroundWorker의 ReportProgress 메소드를 호출 할 수 있습니다. ReportProgress 내에서 UI에 필요한 모든 변경 사항을 진행 상황을 나타낼 수 있습니다. 예를 들면 다음과 같습니다.
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
희망이 있습니다.
이벤트를 UI 스레드로 반환하는 것이 어렵 기 때문에 WaitCallback에 대한 조언을 드리겠습니다. (내가 수행하려고하는 것으로 가정합니다.) – Inferis