分類:[C#]
2009/03/24(Tue) 02:11:12 編集(投稿者)
いつも参考にさせて頂いております。
大変困り果てまして、どなたかにお知恵をお貸しいただきたく投稿します。
下記ソースコードは、
Form1に、serialPort1を持つユーザーコントロールを貼って、受信内容を
イベントで通知するプログラムです。
@位置の、受信データをtextBox1に表示する処理で、
{"有効ではないスレッド間の操作: コントロールが作成されたスレッド以外
のスレッドからコントロール 'textBox1' がアクセスされました。"}
が発生します。
DelegateとInvokeの話だとは思ったのですが、ユーザーコントロールに Timer
を貼ってそのタイムアップから、OnCommReadを発行したところ正常に動作します。
お教え頂きたいのは、
コンテナのイベント処理(userControl11_CommRead)で、Invoke不要にする
方法です。
イベントを発行させた後なのでユーザーコントロールとは別のスレッドだと思う
のですが、コンテナとも違うスレッドだと言うことですので、どうしたらよい
でしょうか。
変な思い違いがあるのかもしれませんが、どうぞよろしくお願いいたします。
** userControl11(ユーザーコントロール)**
public delegate void CommReadHandler(string res);
public partial class UserControl1 : UserControl
{
public event CommReadHandler CommRead;
protected virtual void OnCommRead( string res)
{
CommReadHandler handler = CommRead;
handler(res);
}
private void serialPort1_DataReceived(object sender,
SerialDataReceivedEventArgs e)
{
byte[] tempBuf = new byte[1024];
int tempBufCount = serialPort1.BytesToRead;
serialPort1.Read( tempBuf, 0, tempBufCount);
OnCommRead( Encoding.ASCII.GetString(tempBuf, 0, tempBufCount));
}
}
** Form1(コンテナ) **
private void Form1_Load(object sender, EventArgs e)
{
this.userControl11.CommRead +=
new EventSample.CommReadHandler(this.userControl11_CommRead);
}
private void userControl11_CommRead(string res)
{
textBox1.Text = res; // @ ここでエラーが発生します。
}
** 補足
当然ですが、serialPortの場合はInvokeRequired がtrueです。(@の位置)