C# Tips


コントロールUIに複数のスレッドからアクセスするには


基本的には、Controlクラスはスレッドセーフではありません。コントロールクラスはそのコントロールクラスのあるスレッド内からのみアクセスされるように設計されています。したがって、コントロールクラスを複数のスレッドからアクセスするにはDelegateとBeginInvokeを使用します。

具体的には呼びだしたい処理を一つの関数にまとめ(例ではAddNodeTreeView)、その関数をDelegate化し(ここではaddNodeTreeViewHandler)、そのdelegateをBeginInvokeを使ってThread内から呼び出します。

using System.Threading;

//複数スレッドから、コントロールにアクセス
private void button1_Click(object sender, System.EventArgs e)
{
	Thread thread1 = new Thread(new ThreadStart(ThreadNodeAdder));
	thread1.Start();
	Thread thread2 = new Thread(new ThreadStart(ThreadNodeAdder));
	thread2.Start();
}

//----------------------------------------------------------------------------------------------

//デリゲートの宣言
delegate void AddNodeViewDelegate();

//デリゲートのインスタンス
private AddNodeTreeViewDelegate addNodeTreeViewDelegate = new AddNodeTreeViewDelegate(AddNodeTreeView);

private void AddNodeTreeView()
{
	TreeNode node = new TreeNode("New");
	treeView1.Add(node);
}

//公開メソッド
public void ThreadNodeAdder()
{
	IAsyncResult ar = BeginInvoke(addNodeTreeViewDelegate);	

	while(ar.IsCompleted == false)
	{
		Thread.Sleep(100);
	}
}


目次に戻る
Copyright(c) 2008 WoodenSoldier Software