UWP MVVM concurrent ObservableCollection
本文关键字:ObservableCollection concurrent MVVM UWP | 更新日期: 2023-09-27 18:02:43
在我的程序中,我有一个viewmodel页面。Viewmodel在另一个线程中每隔10秒执行一次Update函数。
// 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);
}
}
视图模型也有绑定到ListView
的ObservableCollection
。如何填补ObservableCollection
从另一个线程与新数据每10秒?
您应该使用DispatcherTimer,如果有异步使用ui,您可以
await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
() =>
{
//code
});
System.Threading。定时器类提供了一种机制,用于按指定的时间间隔在线程池线程上执行方法。一旦将Data
绑定到ListView
, Data
就与UI线程相关联。在UWP中,我们不能直接从工作线程访问UI线程。正如@lindexi所说,我们需要使用CoreDispatcher。RunAsync方法来调度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);
}
});
}