Q&A - VisualC#.netではじめるTCPネットワークプログラミング

P85 のサーバーアプリケーションを作成したのですが、「有効ではないスレッド間の操作: コントロールが作成されたスレッド以外のスレッドからコントロール 'rtbox_show' がアクセスされました。」というエラーが出て、正常に動作しません。この場合、プログラムをどのように変更すればいいでしょうか。

.Net frameworkのバージョンは1.1から2.0にアップして、仕様が変わるところが多いです。今回の例で言えば、他のスレッドから UI スレッドに対する操作のチェックは曖昧でしたが、2.0になって、このチェックは厳しくなってきて、完全にできなくなりました。
そこで、違うスレッドから、UI を更新するには、delegate を使う方法があります。

------------------------ Start -----------------------------------------
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
// 追加
using System.Threading;

namespace lianxi
{
public partial class Form1 : Form
{
private delegate void MyDelegate(string s);
MyDelegate ShowMsg;

public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
ShowMsg = new MyDelegate(OutputMsg);

Thread t1 = new Thread(new ThreadStart(run1));
t1.IsBackground = true;
t1.Start();

Thread t2 = new Thread(new ThreadStart(run2));
t2.IsBackground = true;
t2.Start();
}

private void run1()
{
while (true)
{
Thread.Sleep(500);
this.Invoke(ShowMsg, new object[] { "スレッド1です" });
}
}
private void run2()
{
while (true)
{
Thread.Sleep(800);
this.Invoke(ShowMsg, new object[] { "スレッド2です" });
}
}
private void OutputMsg(string s)
{
this.rtbox_show.AppendText(s + "\r\n");
}
}
}

------------------------ End ------------------------------------------