線程間操作無效: 從不是創建控件(對 Windows 窗體控件進行線程安全調用)

對 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("線程調用");
            }
        }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章