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有太大的工作量。
若有觀念錯誤、內容錯誤,勞請告知。 謝謝。
若要轉載請註明出處,謝謝。