MDI 应用程序中的 BackgroundWorker
BackgroundWorker in MDI app
我正在尝试在我的 MDI 应用程序中使用 BackgroundWorker 来处理将文件上传到 FTP 服务器并在进度条上显示进度的过程。
当我尝试使用一个简单的 window 和一个按钮在单独的概念验证应用程序上执行此操作时 - 它工作正常。但是当我尝试在我的真实应用程序中执行此操作时 - doWork sub 不会 运行。取而代之的是应用程序立即 运行s RunWorkerCompleted sub 并向我显示 "Upload complete" 而没有执行实际工作。
关于 MDI 是否有什么东西阻止 BackgroundWorker 运行 与常规 window 应用程序相同的方式?
在此先感谢您的帮助
代码:
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
您需要检查 RunWorkerCompleted 事件中的 e.Error,因为它很可能有异常。正如@Zaggler 提到的,您正在后台线程上访问 UI 控件,这将导致此问题。
我正在尝试在我的 MDI 应用程序中使用 BackgroundWorker 来处理将文件上传到 FTP 服务器并在进度条上显示进度的过程。
当我尝试使用一个简单的 window 和一个按钮在单独的概念验证应用程序上执行此操作时 - 它工作正常。但是当我尝试在我的真实应用程序中执行此操作时 - doWork sub 不会 运行。取而代之的是应用程序立即 运行s RunWorkerCompleted sub 并向我显示 "Upload complete" 而没有执行实际工作。
关于 MDI 是否有什么东西阻止 BackgroundWorker 运行 与常规 window 应用程序相同的方式?
在此先感谢您的帮助
代码:
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
您需要检查 RunWorkerCompleted 事件中的 e.Error,因为它很可能有异常。正如@Zaggler 提到的,您正在后台线程上访问 UI 控件,这将导致此问题。