[Windows Phone]簡單的執行緒應用。

  • 1127
  • 0
  • 2014-01-22

Windows phone 非參數傳遞的Thread說明。

當我們使用APP時,都不會喜歡程式卡住。而在卡住的時間,我們總是會想著是程式正在執行還是程式當了,而我大部份的想法是程式正在執行,想說是資料量太大或是處理器還沒處理完,可是事實上大部份的結果都是程式當了,這會讓人挺不悅的…,畢竟浪費了很多時間在等待回應(都能重開程式到剛剛畫面了)。

 

所以在寫Phone的APP時,我覺得Thread是一個需要非常去注意的功能,會關係到使用者怎麼看待開發者的這支APP。

 

首先,我們先寫一段要處理的事情。

   1: void printnum()
   2:        {
   3:             Dispatcher.BeginInvoke(() =>   
   4:             {
   5:                 for (int i = 0; i < 11; i++)
   6:                 {
   7:                     TextBlock.Text = TextBlock.Text + "," + i;
   8:                 }
   9:             });
  10:         }

 

 

我們將printnum()看成一件工作,而他要處理的事情是在TextBlock上輸出「0,1,2,…,10」。(Dispatcher.BeginInvoke我們後面會說明)

 

接著我們需要匯入「System.Threading」。就像要做一件事(規模比較大),需要人手,這裡像是「張貼徵人啟事」。

   1: using System.Threading;

 

接下來我們成功招募到人手(有「Ts」個人手)後,要告訴他們工作內容。要清楚的告訴他們工作內容,不然小心他們去勞工局投訴!(題外話)

   1: ThreadStart Ts = new ThreadStart(printnum);

 

有「Ts」個人知道了這件工作的內容後,要找個領導人「t」來帶領他們做事。(怕沒有人帶領,成效不彰。)

   1: Thread t = new Thread(Ts);

 

之後就是領導人「t」的發號施令了。

   1: t.Start();

 

全部的程式碼是這樣子。

   1: using System.Threading;
   2:  
   3: namespace thread
   4: {
   5:     public partial class MainPage : PhoneApplicationPage
   6:     {
   7:         public MainPage()
   8:         {
   9:             InitializeComponent();
  10:             ThreadStart Ts = new ThreadStart(printnum);
  11:             Thread t = new Thread(Ts);
  12:             t.Start();
  13:         }
  14:  
  15:         void printnum()
  16:         {
  17:             Dispatcher.BeginInvoke(() =>   
  18:             {
  19:                 for (int i = 0; i < 11; i++)
  20:                 {
  21:                     TextBlock.Text = TextBlock.Text + "," + i;
  22:                 }
  23:             });
  24:         }
  25:         
  26:     }
  27: }

 

 

最後簡單的說明有關「Dispatcher.BeginInvoke」的部份。

因為執行printnum()的這個Thread不是UI Thread,所以不能直接控制UI,必需加上BeginInvoke或是Invoke才能控制。

但若Dispatcher把繁重的工作交給UI Thread執行,會導致UI Thread畫面卡死(要處理Dispatcher交付的工作),所以在Dispatcher的工作中,必須是「小且能快速的回應」,讓UI隨時保持能回應的狀態,使用者也不用猜想是程式當掉還是程式正在處理。

所以處理時間太長的工作需要拆開至不同的Thread去處理,不該讓UI Thread有太大的工作量。

 

若有觀念錯誤、內容錯誤,勞請告知。 謝謝。

若要轉載請註明出處,謝謝。