天天看點

c# winform開發 從線程中通路控件

winform開發就會涉及到線程中控制UI控件的問題,通常情況下是不能線上程中操作UI控件的,如果在調試模式下就會出現“線程間操作無效: 從不是建立控件“%%”的線程通路它。”的錯誤。那麼正确的方法是使用委托,委托主線程操作UI,其實對C#的委托我也還沒入門。。。這一點Mac下面就簡單多了,直接有調用主線程更新UI的方法。

好了,廢話不多說,先說不傳參數的方法,線上程中寫上

this.Invoke(new MethodInvoker(UpdateUI));
           
private void UpdateUI()
        {
            button1.Enabled = false;
            button2.Enabled = true;
            richTextBox1.Text = "添加内容";
        }
           

UpdateUI這個方法就能在主線程中運作,編譯器就不會說不是建立控件的線程通路了。如果要傳遞參數給這個方法怎麼辦呢?比如我想寫一個方法來更新richTextBox,每次通過我傳遞的參數更新它。那首先肯定是要寫這個方法,代碼如下:

private void UpdateRichTextBox(string text)
        {
            richTextBox1.Text = text;
        }
           

由于最上面的MethodInvoker隻能建立不帶參數的委托方法,是以這兒需要自己聲明一個委托

private delegate void UpdateRichTextBoxEventHandler(string text);
           

然後修改

this.Invoke(new MethodInvoker(UpdateUI));
           

this.Invoke(new UpdateRichTextBoxEventHandler(UpdateRichTextBox), new object[] { "監聽啟動\n" });
           

好了,到此如何線上程中操作控件就說完了,特别要提醒的是,如果不在調試模式下面運作,線上程中操作控件也不一定會出問題,但是線程多了,操作界面頻繁了,程式就會報錯死掉。是以還是把所有的和UI有關的操作都放到主線程中去吧。