[Windows 8 Store App] 使用獨立執行緒實作計時器(Timer)

[Windows 8 Store App] 使用獨立執行緒實作計時器(Timer)

前言

 

 


在Windows 8 App的開發中,

專案中已經預設提供了一種簡單的類別 DispatcherTimer,使用起來相當簡單方便,

但這個類別的運作方式是依附在主執行緒之下的,

所以應付簡單的事件還可以,但如果是複雜、頻繁的運算就會有點應付不來囉

因此我們會需要將事件建立在獨立於主執行緒之外的執行緒。

 

 

程式

 


首先加入這些類別宣告

   public ThreadPoolTimer Timer;
   public CoreDispatcher eventDispatcher;
   public TimerElapsedHandler TimerHandle;
   public TimeSpan timesdelay;

 

 

 

通常在乾淨的專案下還會需要加入這些引用

   using Windows.System.Threading;
   using Windows.UI.Core;

 

接著就在程式啟動的地方,例如建構式MainPage()中加入

 

eventDispatcher = Window.Current.CoreWindow.Dispatcher;
 

取得事件發送器

然後在要Create物件的地方設定Timer的詳細資料

 

timersdelay = TimeSpan.FromMilliseconds(1000);       //這裡以1000毫秒為例
TimerHandle = new TimerElapsedHandler(timer_tick);

 

這裡註冊了一個叫做timer_tick的函式,所以還要撰寫其詳細內容

 

void timer_tick(ThreadPoolTimer timer) { }
 

如果這個timer的需求只是單純做運算,

例如 frameCount += 1; 這樣簡單的code,直接寫在timer_tick就可以了,

但是如果有任何直接影響UI的需求,例如修改某個TextBox的Text,

那就一定還要再透過委派,因為執行緒絕對不能碰別的執行緒(主執行緒的UI)裡的東西!

這時就是剛剛抓到的事件發送器就派上用場啦,把剛剛的timer_tick前面加入非同步關鍵字async與程式碼

 
async void timer_tick(ThreadPoolTimer timer)
{
    await eventDispatcher.RunAsync(CoreDispatcherPriority.High, control_tick);
}

void control_tick() { }

 

這個動作就是將更改UI的動作再發包給事件發送器,他會將任務塞進主執行緒的運作清單中,

其中參數CoreDispatcherPriority,也就是事件優先度,可以選擇High Nomal Low三種,根據需求設定

建議把主要運算的部分還是都放在timer_tick裡面,只把跟UI有關係的程式放在control_tick裡面就好囉!

不然特別開執行緒來跑就沒意義啦

 

這麼一來整個Timer的運作流程就完成了,還差臨門一腳,

這只是流程會正常運作,可還需要一個啟動開關,

還沒忘了前面第一個參數Timer吧,就是它啦。

在要啟動該Timer的地方(比如說是一個Strart的按鈕)加入程式

 
Timer = ThreadPoolTimer.CreateTimer(TimerHandle, timesdelay);
Timer = ThreadPoolTimer.CreatePeriodicTimer(TimerHandle, timesdelay);

 

前者是只執行一次,後者是不斷重複,看各位的需求吧!

想要停止可以用 Timer.Cancel(); 停止

 

 

以上就是在Windows 8 Store App中使用獨立執行緒實作Timer的流程,希望各位開發App順利!