- - PR -
BackgroundWorkerの使い方
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2008-09-14 19:39
別スレッドからコントロールをアクセスしたいのでBackgroundWorkerを使って実現しようと思いましたがデバッグ中に
「有効ではないスレッド間の操作: コントロールが作成された スレッド以外のスレッドからコントロール 'label1' がアクセスされました。」 と表示されてしまいます。 backgroundWorker1.RunWorkerAsync();を別スレッドから実行すると、上記のエラーが表示されますが、コントロールと同じスレッドからbackgroundWorker1.RunWorkerAsync();を実行すると上記のエラーは表示されないで正常に動作します。 COMポートの通信をするスレッドを作成し 受信するデータにより、コントロールをアクセスしたいので 通信するスレッドからbackgroundWorker1.RunWorkerAsync();を 実行したいのですが、上記のエラーが表示されてしまいます。 どの様にすればよろしいでしょうか? 下記にテスト用のソースを書きました。 よろしくお願いします。 namespace BackgroundWorkerTest1 { public partial class Form1 : Form { private Thread iniThread = null; public Form1() { InitializeComponent(); initial(); } public void initial() { iniThread = new Thread(new ThreadStart(InitialThread)); iniThread.Name = "Initial"; iniThread.Priority = ThreadPriority.AboveNormal; iniThread.Start(); } private void InitialThread() { while (true) { System.Threading.Thread.Sleep(3000); backgroundWorker1.RunWorkerAsync(); } } private void backgroundWorker1_Completed(object sender, RunWorkerCompletedEventArgs e) { label1.Text = "3秒経過"; } } } | ||||
|
投稿日時: 2008-09-14 21:57
Windows のコントロールはそれを作成したスレッドと同じスレッドからしか操作できません。
従って
のように、BeginInvokeを使って操作します。 あと問題とは別ですが、新しいスレッドを起動して、更にそこから BackgroundWorker を起動する意味が何かあるのかなーと感じます。 _________________ 囚人のジレンマな日々 | ||||
|
投稿日時: 2008-09-14 22:40
同期的に操作を実行したい場合は Invoke() を、非同期に操作を実行したい場合は BeginInvoke() を使用します。 |
1