2013年5月29日 星期三

[W8App] ListBox Binding data (4) – Update data asynchronous

W8App的非同步(Async)與傳統桌面系統的多緒(multi-thread)在操作上有一點點的不太一樣,傳統的多緒系統CreateThread通常都會對應一個WaitForSingleObject,等待該工作的完成。但非同步的機制確不需要再額外coding一個等待機制隨時的檢查資料是否有更新(或是檢查資料是否全部更新完)

Async

以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

沒有留言:

張貼留言