2016-08-16 97 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); 
     } 
    }); 
}