201612182024多執行緒應用程式開發

最近為了讀取Zigbee device從串列埠傳到桌機上的資料,重新複習了多執行緒的開發過程,並留下記錄以免又忘記。

在主執行緒(UI)以外的次要執行緒執行的工作完成後要更新UI時,要用委派的方式間接完成。所以一開始要先宣告委派類別。

// declare a delegate class
public delegate void myDelegate(string data_in);
緊接著宣告一個在次要執行緒執行的副程式,他會更改主執行緒的UI內容,其型別與輸入的參數等
都要和這個委派類別myDelegate一樣。
public void changeUI(string data)
{
    this.textBox1.Text += data + Environment.NewLine;

}
接著宣告一個ThreadStart委派物件,他的參數是要在次要執行緒上執行的方法。這邊命名為DoWork()。

public void DoWork()
{
    myDelegate md = new myDelegate(changeUI);
    this.textBox1.Invoke(md, new object[] { "Hello UI" });
}
因為changeUI()是在次要執行緒工作,要更改UI(TextBox)內容就必須透過委派方式。
所以在DoWork的定義裡宣告一個myDelegate物件,參數就是這個changUI,當要修改textBox時,
要呼叫Invoke方法。該方法第一個參數是myDelegate物件md,然後是傳給changeUI的參數,
這裡是Hello UI這個字串。(請注意changeUI的參數也是字串型別)。
然後把DoWork()當作ThreadStart物件初始化的參數。
private void Form1_Load(object sender, EventArgs e)
{
    ThreadStart ts = new ThreadStart(DoWork);
    Thread t = new Thread(ts);
    t.Start();
}
宣告一個ThreadStart物件ts,初始化時的參數是DoWork(請注意不要和myDelegate搞混,
myDelegate類別只是做為執行緒間的中間橋樑
)。
然後再把這個ts當作次要執行緒t的初始化參數。接著啟動次要執行緒就可以了。先到這裡,
以後再繼續更新。
回應
關鍵字
[此功能已終止服務]
    沒有新回應!





Powered by Xuite