3

backgroundworker クラスを含むフォームをロードしようとすると、現在のスレッドではなく別のスレッドによって作成されたオブジェクトにアクセスしようとしたため、例外がスローされます。backgroundworker でそのフォームをロードする方法は?

(フォームの読み込み中にマーキー プログレス バーを探しています)

4

4 に答える 4

1

バックグラウンド ワーカーの 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
于 2013-02-25T18:45:54.087 に答える
0

これにより、クロススレッドのチェックが無効になります

Me.CheckForIllegalCrossThreadCalls = False

BackgroundWorker クラスの適切な使用方法については、Cross Thread を検索することをお勧めします。

于 2013-02-25T18:28:03.863 に答える
0

これはできません。フォームにはスレッド アフィニティがあります。すなわち。フォームをインスタンス化したスレッドのみがアクセスできます。バックグラウンド スレッドがフォームの UI スレッドになりました。したがって、あなたがしなければならないことは、呼び出しを正しいスレッドにマーシャリングすることです。テストの呼び出しが必要です。true の場合、デリゲートをインスタンス化し、BeginInvoke を呼び出してすぐに戻ります。これで、呼び出しが正しいスレッドにマーシャリングされます。

于 2013-02-27T08:26:40.630 に答える
0

別のスレッドで 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イベントを、進行状況バーへのレポートの目的で使用できます。

于 2013-02-25T19:14:59.973 に答える