1. 程式人生 > 其它 >如何跨執行緒訪問Winform中的UI元素

如何跨執行緒訪問Winform中的UI元素

如何跨執行緒訪問Winform中的UI元素

假如製作一個Socket聊天應用程式,很可能會用到多執行緒;

例如為Receive方法開闢單獨一個執行緒,例如為Receive方法開闢單獨一個執行緒(後臺執行的執行緒IsBackGround=true);

然而Winform的UI控制元件都是執行在主執行緒中的,如果從其他執行緒直接訪問UI控制元件,系統就會報錯;

        public void Show(string s)
        {
            listBox1.Items.Add(s);
        }

那麼如何才能在其他執行緒訪問主執行緒,並且向UI控制元件傳遞資料呢?

有兩種方法可以選擇:

一、用BeginInvoke

        public void ShowMessage(string message)
        {
            BeginInvoke(new Action<string>((msg) => listBox1.Items.Add(msg)), new object[] { message });

        }

二、用委託

        //宣告委託
        public delegate void ShowMsg(string s);
        
        //委託要繫結的方法
        public void Show(string s)
        {
            listBox1.Items.Add(s);
        }

        //在多執行緒中呼叫的方法,不會報錯的方法
        public void ShowMessage(string message)
        {
            //例項化委託,並繫結方法
            ShowMsg OnShowMsg = new ShowMsg(Show);
            //如果是跨執行緒的執行if程式碼塊
            if (this.InvokeRequired)
            {
                this.Invoke(OnShowMsg, message);
            }
            //如果不是跨執行緒的,執行else程式碼塊
            else
            {
                Show(message);
            }
        }