ผมใช้ BackgroundWorker และ Progressbar ใน Mdi Form แล้วมันเกิด Error
"Cross-thread operation not valid: Control 'StatusStrip1' accessed from a thread other than the thread it was created on" ไม่รู้ว่าจะแก้ยังงัย code ข้างล่างนี้เป็น code ส่วน mdi form ที่รับToolStripProgressBar มาจาก Form main ครับแล้วเกิด Error ที่ m.Visible = True
Code (VB.NET)
#
Public Frmparent As Form1
Dim m As ToolStripProgressBar
Dim worker As System.Threading.Thread ' Thread
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
BackgroundWorker1.RunWorkerAsync()
End Sub
Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
m = Frmparent.ToolStripProgressBar1
End Sub
Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
m.Visible = True
For i As Integer = 0 To 10000000
Dim k As New ArrayList
k.Add(i)
Next
MsgBox("o")
End Sub
#
ใน Event Handler ชื่อ BackgroundWorker1_DoWork (Event DoWork ของ BackgroundWorker)
ห้ามมีการ Set ค่าของ control นะครับ เพราะว่าการ set ค่าของ control จะเกิดการ RePaint ของ Form (แล้วการ Repaint ของ form จะมีการเรียก Thread ในการ Paint) ดังนั้น ถ้าจะแก้คือ ต้องเป็นประมาณนี้
Code
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
m.Visible = True <== ย้ายมาวางตรงนี้
BackgroundWorker1.RunWorkerAsync()
End Sub
Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
m = Frmparent.ToolStripProgressBar1
End Sub
Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
[m.Visible = True] <== ย้ายออกไป
For i As Integer = 0 To 10000000
Dim k As New ArrayList
k.Add(i)
Next
MsgBox("o")
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
m.Visible = True
BackgroundWorker1.RunWorkerAsync()
End Sub
Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
m = Frmparent.ToolStripProgressBar1
End Sub
Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
Dim k As New ArrayList
For i As Integer = 0 To 10000000
k.Add(i)
Next
End Sub
Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs)
Handles BackgroundWorker1.RunWorkerCompleted
If e.Error is Nothing Then
MsgBox("Work is Completed")
Else
MsgBox(String.Format("Work fail with error: {0}",e.Error.Message))
End If
End Sub