2016-08-14 3 views
1

MDI 응용 프로그램에서 BackgroundWorker를 사용하여 파일을 FTP 서버에 업로드하고 진행률 표시 줄에 진행률을 표시하는 프로세스를 처리하려고합니다.MDI 응용 프로그램의 BackgroundWorker

단순한 창과 하나의 버튼으로 개념 증명 응용 프로그램을 사용하려고했을 때 제대로 작동했습니다. 그러나 내 실제 응용 프로그램에서 그것을하려고 할 때 - doWork 하위가 실행되지 않습니다. 대신 그것은 즉시 RunWorkerCompleted 서브를 실행하고 실제 작업을 수행하지 않고 "Upload complete"를 보여줍니다.

BackgroundWorker가 일반 창 응용 프로그램과 같은 방식으로 실행되지 못하도록하는 MDI가 있습니까? 당신의 도움에 미리

감사

코드 :

당신이 가장 가능성이 예외를 보내고로 RunWorkerCompleted 이벤트 e.Error를 확인해야
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 

    bWorker.RunWorkerAsync() 

End Sub 

Private Sub bWorker_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles bWorker.DoWork 

    Dim source = Application.StartupPath + "\Db\test.mdb" 
    Dim NameToUpload As String = Path.GetFileName(source) 

    NameToUpload = NameToUpload.Replace(".", DateTime.Now.ToShortTimeString() + ".") 

    Dim request As FtpWebRequest = DirectCast(WebRequest.Create(Host + "/" + txtLogin.Text + "/" + NameToUpload), FtpWebRequest) 
    request.Method = WebRequestMethods.Ftp.UploadFile 
    request.Credentials = New NetworkCredential(txtLogin.Text, txtPassword.Text) 
    Dim FileStream() As Byte = File.ReadAllBytes(source) 
    Dim requestStream As System.IO.Stream = request.GetRequestStream() 

    For offset As Integer = 0 To FileStream.Length Step 1024 
     bWorker.ReportProgress(CType(offset * ProgressBar1.Maximum/FileStream.Length, Integer)) 
     Dim chSize As Integer = FileStream.Length - offset 
     If chSize > 1024 Then chSize = 1024 
     requestStream.Write(FileStream, offset, chSize) 
    Next 
    requestStream.Close() 
    requestStream.Dispose() 
End Sub 

Private Sub bWorker_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) 
    ProgressBar1.Value = e.ProgressPercentage 

End Sub 

Private Sub bWorker_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) 
    MsgBox("Upload complete") 
End Sub 
+1

그래서 'bWorker_DoWork' 이벤트에 중단 점을 설정하면 충돌이 발생하지 않습니까? 또 다른 메모에서 백그라운드 작업자의 UI 스레드에 액세스하려고 시도해서는 안되며이 값을 작업 이벤트에 전달해야합니다. UI를 업데이트하지 않기 때문에 문제가되지 않을 수도 있지만, 배경 작업자가 UI와 다른 스레드이므로 여전히 좋은 습관입니다. – Codexer

답변

0

. @Zaggler가 백그라운드 스레드에서 UI 컨트롤에 액세스하고 있음을 언급합니다.