[C#]線程中處理界面委託的小例子

在多線程中處理界面的響應信息,確實沒有單線程那麼容易,直接賦值就OK了,必須得通過委託到主線程中才可以處理,這個小DEMO實現了兩個線程同時在主界面上進行輸入.當初自己怎麼也弄不明白這些道理,只要弄出第一個實例,後面的就輕鬆多了,萬事入門難嘛.直接貼代碼,解釋都在註釋裏了,其他就不多廢話了.

 

  1.         private void button1_Click(object sender, EventArgs e)
  2.         {
  3.             //初學的時候這裏經常弄不清楚到底是該用ThreadStart還是用Thread
  4.             //其實沒有必要一定要弄到ThreadStart的,它只是使用委託線程
  5.             //Thread t = new Thread (new ThreadStart (Go));相當於下面的寫法:
  6.             //public delegate void ThreadStart();
  7.             //Thread t = new Thread (new ThreadStart (Go));編譯的時候將和委託一樣
  8.             //Thread t = new Thread (delegate() { Go中的代碼 });
  9.             Thread s1 = new Thread(addwebper1s);
  10.             //IsBackground是申明一個後臺線程,爲什麼做後臺線程呢?
  11.             //因爲主線程退出的時候,後臺線程會自動銷燬,否則回駐留在內存中
  12.             s1.IsBackground = true;
  13.             s1.Start();
  14.             Thread s2 = new Thread(addwebper2s);
  15.             s2.IsBackground = true;
  16.             s2.Start();            
  17.         }
  18.         private void addwebper2s()
  19.         {
  20.             while (true)
  21.             {
  22.                 AddMsg("http://www.csdn.net/r/n");
  23.                 //線程休眠2秒
  24.                 Thread.Sleep(2 * 1000);
  25.             }
  26.         }
  27.         private void addwebper1s()
  28.         {
  29.             while (true)
  30.             {
  31.                 AddMsg("http://blog.csdn.net/much0726/r/n");
  32.                 //線程休眠1秒
  33.                 Thread.Sleep(1 * 1000);
  34.             }
  35.         }
  36.         delegate void addmsg(string msg);
  37.         private void AddMsg(string msg)
  38.         {
  39.             //把鼠標放上去看解釋就知道了,就是防止創建控件以外的線程調用(.NET是類型安全的)
  40.             if (this.InvokeRequired)
  41.             {
  42.                 //爲當前控件指定委託
  43.                 this.Invoke(new addmsg(AddMsg), msg);
  44.             }
  45.             else
  46.             {
  47.                 //被委託到主線程後真正執行的代碼
  48.                 //爲什麼會執行到這裏?
  49.                 //不好解釋,大概是因爲委託的主線程後,this.InvokeRequired=false了吧
  50.                 textBox1.Text += msg;
  51.             }
  52.         }

 

小結

雖然在多線中訪問主線中的控件資源,表象看來,好象必須要對改控件進行互斥鎖,但是,實際上是沒有必要的,這點我也沒有弄明白爲什麼,在多線程中,複雜的界面響應也會給程序帶來更多的BUG,測試成本會無形的擴大,個人建議,如果是服務端程序就使用控制太的Console輸出就可以了,如果是用戶體驗要求比較高的程序,需要進行多方面的壓力測試纔行.

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