线程间操作无效: 从不是创建控件(对 Windows 窗体控件进行线程安全调用)

来源:互联网 发布:淘宝企业店铺认证流程 编辑:程序博客网 时间:2024/05/17 02:25

对 Windows 窗体控件进行线程安全调用

  1. 查询控件的 InvokeRequired 属性。

  2. 如果 InvokeRequired 返回 true,则使用实际调用控件的委托来调用 Invoke。

  3. 如果 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("线程调用");
            }
        }

 

原创粉丝点击