DOBON.NET DOBON.NETプログラミング掲示板過去ログ

BackgroundWorkerのDoWorkイベントについて

環境/言語:[Vista]
分類:[.NET]

こんばんは.非同期でスレッドを実行するBackgroundWorkerのDoWorkイベントについて教えて頂けますでしょうか.

以下のような文を実行すると,Me.TextBox1.Text = mojiのところで,
有効ではないスレッド間の操作:コントロールが作成されたスレッド以外のスレッドからコントロール'TextBox1'がアクセスされました.
という例外が発生します.
例外発生時のヒントも参照したのですが,難しくよくわかりませんでした.
例外が発生しないでTextBox1に文字を出力させるには実際どのようにすればよいのでしょうか.
初心者ですので,わかりやすく教えていただけると幸いです.

Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork

Dim moji As String = "aiueo"
Me.TextBox1.Text = moji

End Sub

よろしくお願いします.
http://msdn.microsoft.com/ja-jp/library/system.componentmodel.backgroundworker.dowork(VS.80).aspx?ppud=4
に書かれてるのはちょっと不足かな。
http://msdn.microsoft.com/ja-jp/library/system.componentmodel.backgroundworker(VS.80).aspx
こちらにどこでユーザーインターフェイス、つまりコントロールとアクセスするか書かれています。
サンプルコードや各イベントの解説なども読んでみてください。
Hongliangさんが記載されているリンク先に、以下のような記述があります。

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
DoWork イベント ハンドラでユーザー インターフェイス オブジェクトを操作しないように注意する必要があります。代わりに、ProgressChanged イベントと RunWorkerCompleted イベントを通じてユーザー インターフェイスと通信します。
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

rateさんはいまBackgroundWorker1_DoWorkメソッド内でMe.TextBox1.Text = mojiという記述しようとしていますが、これが上記の記述にひっかかっています。

具体的な処理次第ですが、

BackgroundWorker1_DoWorkメソッド内で何かの処理をしていて、その進捗に応じてMe.TextBox1.Textの値を変えたいのであれば、BackgroundWorkerのProgressChangedイベントにメソッドを登録し、そのメソッドの中でMe.TextBox1.Textの値を変えてください。

そうではなく、BackgroundWorker1_DoWorkメソッドの処理が完了したあとに、Me.TextBox1.Textの値を変えたいのであればBackgroundWorkerのRunWorkerCompletedイベントにメソッドを登録し、そのメソッドの中でMe.TextBox1.Textの値を変えてください。
Hongliang様、紅の豚118 様

お礼、遅くなってすみません。
URLや具体的な処理方法を教えて頂き、ありがとうございました。

参考にさせていただき、解決いたしました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板