随着进度更新异步ObservableCollection

本文关键字:异步 ObservableCollection 更新 | 更新日期: 2023-09-27 17:57:52

我的问题是,我的任务正在更改一个可观察的集合,该集合是绑定到UI元素的数据。我的任务将报告进度,这些数据将通过observable collection:更新到ui

async private void getProductData()
{
    await Task.Run(() => getTableDataFromDb(new Progress<string>(
       data => _prc.Add(new ProductList() { Taxe = data })
       ), "List"));
}
private void getTableDataFromDb(IProgress<string> progress, string tabelName)
{
   //simple exemple
   for(var i =0; i < 100; i++)
     progress.Report( "test"+i);
}

如果我运行这个代码,我会得到这个错误:

此类型的CollectionView不支持对其SourceCollection来自不同于Dispatcher线程的线程。

我如何访问主线程来更新这些集合?感谢

随着进度更新异步ObservableCollection

问题是您在错误的线程中创建了Progress<string>对象。它是在实际执行工作的同一个工作线程中创建的,这意味着它没有捕获正确的SynchronizationContext对象来将工作封送回所需的线程。

相反,你想要这样的东西:

async private void getProductData()
{
    IProgress<string> progress = new Progress<string>(
       data => _prc.Add(new ProductList() { Taxe = data }));
    await Task.Run(() => getTableDataFromDb(progress, "List"));
}

这将在调用getProductData()的线程中创建Progress<string>对象,该线程可能是您的UI线程。然后,当调用IProgress<string>.Report()方法时,委托调用将按预期编组回UI线程。