[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順利!