完整代码如下
Imports System.ComponentModel
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
BackgroundWorker1.RunWorkerAsync() '开始后台线程
End Sub
Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
BackgroundWorker1.ReportProgress(1) '后台线程委托前台线程调用ProgressChanged事件
'后台线程至此结束,结束后会委托前台线程调用RunWorkerCompleted事件,注意此委托位于ReportProgress之后
End Sub
Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
MsgBox("BackgroundWorker1_ProgressChanged 线程ID是 " & Threading.Thread.CurrentThread.ManagedThreadId.ToString())
End Sub
Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
MsgBox("BackgroundWorker1_RunWorkerCompleted 线程ID是 " & Threading.Thread.CurrentThread.ManagedThreadId.ToString())
End Sub
End Class
'问题:
'为什么明明是先由BackgroundWorker1.ReportProgress委托前台线程调用ProgressChanged事件
'再由BackgroundWorker1_DoWork的结束委托前台线程调用RunWorkerCompleted事件
'结果确是RunWorkerCompleted事件内的对话框先弹出来? 顺序颠倒的原理是什么?