2016-08-16 80 views
-1

在我的程序中,我有一個頁面viewmodel。視圖模型執行更新功能,每10秒與定時器另一個線程:UWP MVVM併發ObservableCollection

// in viewmodel ctor 
var timer = new Timer(Update, 0, 10000); 

public ObservableCollection<Tick> Data { get; set; } 

public void Update(object state) 
{ 
    var query = xbtceService.GetAllTicksAsync(); // get data from service 
    query.Wait(); 
    var data = query.Result; 
    if (data.Any()) 
    { 
     dataAccess.SaveItems(data); //save data in database 
    } 

    Data.Clear(); // ERROR, another thread 
    var list = dataAccess.LoadList(); 
    foreach (var item in list) 
    { 
     Data.Add(item); 
    } 
} 

而且視圖模型具有ObservableCollection是綁定到一個ListView。如何從另一個線程每10秒用新數據填寫ObservableCollection

回答

0

您應該使用DispatcherTimer,如果有異步想使用的用戶界面,你可以

  await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, 
      () => 
      { 
       //code 
      }); 
+0

任何方式來更新與mvvm模式的集合? –

+0

您可以添加ViewModel – lindexi

0

System.Threading.Timer Class提供了在指定的時間間隔在一個線程池線程執行的方法的機制。一旦你將Data綁定到ListView,Data就與UI線程相關聯。在UWP中,我們無法直接從工作線程訪問UI線程。正如@lindexi所說,我們需要使用CoreDispatcher.RunAsync method來安排UI線程的工作。例如,你可以改變你的Update方法如下:

public async void Update(object state) 
{ 
    var query = xbtceService.GetAllTicksAsync(); // get data from service 
    query.Wait(); 
    var data = query.Result; 
    if (data.Any()) 
    { 
     dataAccess.SaveItems(data); //save data in database 
    } 

    await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => 
    { 
     Data.Clear(); 
     var list = dataAccess.LoadList(); 
     foreach (var item in list) 
     { 
      Data.Add(item); 
     } 
    }); 
}