backgroundworker クラスを含むフォームをロードしようとすると、現在のスレッドではなく別のスレッドによって作成されたオブジェクトにアクセスしようとしたため、例外がスローされます。backgroundworker でそのフォームをロードする方法は?
(フォームの読み込み中にマーキー プログレス バーを探しています)
backgroundworker クラスを含むフォームをロードしようとすると、現在のスレッドではなく別のスレッドによって作成されたオブジェクトにアクセスしようとしたため、例外がスローされます。backgroundworker でそのフォームをロードする方法は?
(フォームの読み込み中にマーキー プログレス バーを探しています)
バックグラウンド ワーカーの DoWork セクションは別のスレッドであるため、コントロールを変更することはできません。DoWork セクションでデータを処理してから、RunWorkerCompleted セクションでフォームを更新します。
例:
Private WithEvents bgwTasks As New BackgroundWorker
Private Sub bgwTasks_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgwTasks.DoWork
e.Result= GetDatabaseTable()
End Sub
Private Sub bgwTasks_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgwTasks.RunWorkerCompleted
If e.Result IsNot Nothing Then
DataGridView1.DataSource = e.Result
End If
End Sub
Private Sub Main_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If bgwTasks.IsBusy = False Then
bgwTasks.RunWorkerAsync()
End If
End Sub
これにより、クロススレッドのチェックが無効になります
Me.CheckForIllegalCrossThreadCalls = False
BackgroundWorker クラスの適切な使用方法については、Cross Thread を検索することをお勧めします。
これはできません。フォームにはスレッド アフィニティがあります。すなわち。フォームをインスタンス化したスレッドのみがアクセスできます。バックグラウンド スレッドがフォームの UI スレッドになりました。したがって、あなたがしなければならないことは、呼び出しを正しいスレッドにマーシャリングすることです。テストの呼び出しが必要です。true の場合、デリゲートをインスタンス化し、BeginInvoke を呼び出してすぐに戻ります。これで、呼び出しが正しいスレッドにマーシャリングされます。
別のスレッドで 2 番目のフォームを初期化しても問題ありませんが、メイン フォームのコンテキストで使用する場合は、元のスレッドを使用する必要があります。次のコードは、バックグラウンド ワーカーで新しいフォームを作成して初期化し、適切なイベント ハンドラーで初期化が完了すると表示します。
Public Class Form1
Dim form2 As Form2
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
BackgroundWorker1.RunWorkerAsync()
End Sub
Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
form2 = New Form2()
form2.TextBox1.Text = "Text"
End Sub
Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
form2.Show()
End Sub
End Class
バックグラウンド ワーカーのProgressChangedイベントを、進行状況バーへのレポートの目的で使用できます。