對 Windows 窗體控件進行線程安全調用
-
查詢控件的 InvokeRequired 屬性。
-
如果 InvokeRequired 返回 true,則使用實際調用控件的委託來調用 Invoke。
-
如果 InvokeRequired 返回 false,則直接調用控件。
**********************************************************************************
一個WinFrom界面上一個ListBox控件,通過線程來對該控件進行操作。
private void button13_Click(object sender, EventArgs e)
{
ThreadWithData tws = new ThreadWithData(this.listBox5);
Thread t = new Thread(new ThreadStart(tws.ThreadProc));
t.Start();
}
下面是ThreadWithData類
public class ThreadWithData
{
ListBox liBx;
public ThreadWithData(ListBox LBX)
{
liBx = LBX;
}
delegate void SetListBoxCallback(); //定義委託
public void ThreadProc()
{
Thread.Sleep(5000);
if (liBx.InvokeRequired)//控件是否跨線程?如果是,則執行括號裏代碼
{
SetListBoxCallback setListCallback = new SetListBoxCallback(ThreadProc); //實例化委託對象
liBx.Invoke(setListCallback); //重新調用SetListBox函數
}
else //否則,即是本線程的控件,控件直接操作
{
liBx.Items.Add("線程調用");
}
}