I'm a VB.Net newbie, and need to write a long-running process with a While/End While loop.
To avoid freezing the UI, I added a BackgroundWorker object on the form.
Next, I needed to update the UI, but found that the thread cannot do this. Instead, the thre开发者_运维百科ad must call ReportProgress() to trigger the ProgressChanged() event.
However, I need to pass the text from the exception (ex.Message) to the event, but didn't find an example on how to do this. I need that text message to update the form's title bar.
Here's the code:
Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
While (True)
Try
...
Catch ex As Exception
'Cross-thread operation not valid: Control 'Form1' accessed from a thread other than the thread it was created on.
'Me.Text = ex.Message
BackgroundWorker1.ReportProgress(100)
End Try
System.Threading.Thread.Sleep(2000)
End While
End Sub
Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As System.Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
'How to get ex.Message, and change the form's title bar accordingly?
'Me.Text = ???
End Sub
Thank you.
Edit: Here's how to get the pass the error message to the event, and change the form's title text:
Catch ex As Exception
BackgroundWorker1.ReportProgress(100, ex.Message)
End Try
System.Threading.Thread.Sleep(2000)
End While
End Sub
Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As System.Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
Me.Text = e.UserState.ToString
End Sub
The Reportprogress method has an overload that takes a Int32 and an Object parameter. You can pass the message or the complete Exception to the main Thread.
In the ProgressChanged event you can retrieve it from the UserState property.
精彩评论