簡體   English   中英

用進度更新異步ObservableCollection

[英]updating an async ObservableCollection with progress

我的問題是我的任務是更改與數據綁定到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不支持從與Dispatcher線程不同的線程對其SourceCollection進行更改。

我如何訪問主線程來更新此收藏集? 謝謝

問題是您在錯誤的線程中創建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線程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM