W8App的非同步(Async)與傳統桌面系統的多緒(multi-thread)在操作上有一點點的不太一樣,傳統的多緒系統CreateThread通常都會對應一個WaitForSingleObject,等待該工作的完成。但非同步的機制確不需要再額外coding一個等待機制隨時的檢查資料是否有更新(或是檢查資料是否全部更新完)
以ListBox為例,我們可以把與ListBox繫結的資料,以非同步的方式一筆筆的加到ObservableCollection集合中。這對於大量或是遠端的資料的使用上可避免UI長時間的占用請形有很大的幫助。
不過當ListBox繫結非同步資料時有一點必需注意,新增與移除資料必需是在UI元件同樣的執行緒上執行,
1: await Window.Current.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
2: {
3: // read items collection from file or network ...
4: foreach (var item in items)
5: {
6: SampleDataGroup group = SampleDataSource.GetGroup("AllGroups");
7: group.Items.Add(new SampleDataItem("","","","","","",group));
8: }
9: });
Window.Current會取得目前的window,但是要注意的是若新增(移除)的非同步機制是在另一個頁面或是Runtime dll中時,可能會取到不正確的window,這時就必需先記錄ListBox所在的windows資料。
參考資料:
1. Async Made Simple with C++ PPL, Rahul V. Patil, Microsoft Corporation
沒有留言:
張貼留言