.net MDI应用程序中的BackgroundWorker

.net MDI应用程序中的BackgroundWorker,.net,vb.net,backgroundworker,mdi,.net,Vb.net,Backgroundworker,Mdi,我试图在我的MDI应用程序中使用BackgroundWorker来处理将文件上载到FTP服务器并在进度条上显示进度的过程 当我尝试在一个单独的概念验证应用程序上使用一个简单的窗口和一个按钮时,它工作正常。但是,当我试图在我真正的应用程序中这样做时,doWork sub不会运行。而不是它的应用程序立即运行RunWorkerCompleted子和显示我“上传完成”,而不做实际的工作 MDI是否有什么东西阻止BackgroundWorker以与常规Windows应用程序相同的方式运行 提前谢谢你的帮助

我试图在我的MDI应用程序中使用BackgroundWorker来处理将文件上载到FTP服务器并在进度条上显示进度的过程

当我尝试在一个单独的概念验证应用程序上使用一个简单的窗口和一个按钮时,它工作正常。但是,当我试图在我真正的应用程序中这样做时,doWork sub不会运行。而不是它的应用程序立即运行RunWorkerCompleted子和显示我“上传完成”,而不做实际的工作

MDI是否有什么东西阻止BackgroundWorker以与常规Windows应用程序相同的方式运行

提前谢谢你的帮助

代码:


您需要检查RunWorkerCompleted事件中的e.Error,因为它很可能有异常。正如@Zaggler提到的,您正在访问后台线程上的UI控件,这将导致此问题。

您需要检查RunWorkerCompleted事件中的e.Error,因为它很可能发生异常。正如@Zaggler提到的,您正在访问后台线程上的UI控件,这将导致此问题。

因此,如果您在
bWorker\u DoWork
事件上设置断点,它不会被击中?另一方面,您不应该试图从后台工作线程访问UI线程,请将这些值传递到do work事件中。这可能不是问题,因为您没有更新UI…但这仍然是一个良好的做法,因为后台工作线程与UI是不同的线程。因此,如果您在
bWorker\u DoWork
事件上设置断点,它不会被击中吗?另一方面,您不应该试图从后台工作线程访问UI线程,请将这些值传递到do work事件中。这可能不是一个问题,因为您没有更新UI…但这仍然是一个很好的做法,因为后台工作线程与UI是不同的线程。
 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