- PR -

BackgroundWorkerの使い方

1
投稿者投稿内容
snow
常連さん
会議室デビュー日: 2008/02/05
投稿数: 26
投稿日時: 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秒経過";
}
}
}
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2008-09-14 21:57
Windows のコントロールはそれを作成したスレッドと同じスレッドからしか操作できません。
従って
コード:
label1.BeginInvoke(delegate{
	label1.Text = "3秒経過"; 
});


のように、BeginInvokeを使って操作します。


あと問題とは別ですが、新しいスレッドを起動して、更にそこから BackgroundWorker を起動する意味が何かあるのかなーと感じます。
_________________
囚人のジレンマな日々
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2008-09-14 22:40
引用:

のように、BeginInvokeを使って操作します。



同期的に操作を実行したい場合は Invoke() を、非同期に操作を実行したい場合は BeginInvoke() を使用します。
1

スキルアップ/キャリアアップ(JOB@IT)