16,555
社区成员
发帖
与我相关
我的任务
分享
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事件内的对话框先弹出来? 顺序颠倒的原理是什么?
'放1个Button、1个TextBox
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Debug.Print("Button1 Begin")
Debug.Print("Button1 Step 1")
Me.TextBox1.Text = "abc"
Debug.Print("Button1 Step 2")
Debug.Print("Button1 End")
End Sub
Private Sub TextBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
Debug.Print("TextBox1 Begin")
Debug.Print("TextBox1 Step 1")
Debug.Print("TextBox1 Step 2")
Debug.Print("TextBox1 End")
End Sub
End Class
Button1 Begin
Button1 Step 1
TextBox1 Begin
TextBox1 Step 1
TextBox1 Step 2
TextBox1 End
Button1 Step 2
Button1 End