C# 執行緒中更新介面控制元件
阿新 • • 發佈:2019-02-06
在我們開發軟體時經常會需要跟新介面上的某個控制元件來顯示相關的資訊。
當我們的介面需要在程式執行中不斷更新資料時,當一個textbox的資料需要變化時,為了讓程式執行中不出現介面卡死的現像,最好的方法就是多執行緒來解決
一個主執行緒來建立介面,使用一個子執行緒來執行程式並更新主介面,這樣就不會出現卡死的現像了,這肯定是沒有問題的,但是,我們會發現如果我們在子執行緒中去變動一個不是在這個執行緒中建立的控制元件的時候,系統會報錯,這個時候我們就需要使用到委託來完成這個操作。
委託是C#程式設計一個非常重要的概念,網路上經常會有人說委託是什麼?代理是什麼?區別是什麼?
其實委託和代理是同一個概念,只是沒有明確的官方同一定義所以,你翻譯為委託,我翻譯成代理就這麼多區別。
delegate 是關鍵詞,【注:EventHandler是一個宣告委託的微軟C#的命名標準,我的習慣是標準就要第一時間說,也就這個命名習慣要第一時間養成】
完了,這就是委託,就這麼簡單,看看和我們一般的方法有什麼區別呢?
委託型別宣告:
(1) 以deleagate關鍵字開頭。
(2)返回型別+委託型別名+引數列表。
言歸正傳
要實現標題的問題解決;簡單的幾步就可以
1.定義一個委託;
2.繫結一個方法;
3.子執行緒中呼叫執行
程式碼如下:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Threading; namespace ThreadUpdateUI { public partial class Form1 : Form { Thread myThread; public delegate void InitMainUI(); InitMainUI myMainUI; private void initAll() { richTextBox1.AppendText("TEST line \r"); } public Form1() { InitializeComponent(); myThread = new Thread(doWork); myMainUI = new InitMainUI(initAll); } private void doWork() { for(int i=0;i <10;i++) { Thread.Sleep(1000); //richTextBox1.AppendText("test directly!"); this.Invoke(myMainUI); Application.DoEvents(); } } private void button1_Click(object sender, EventArgs e) { myThread.Start(); } } }