对 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("线程调用");
}
}