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);
    }
}

视图模型也有绑定到ListViewObservableCollection。如何填补ObservableCollection从另一个线程与新数据每10秒?

UWP MVVM concurrent ObservableCollection

您应该使用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);
        }
    });
}