如何在多线程上下文中在ObservableCollection <T>中正确插入IEnumerable <T>

时间:2019-12-24 20:02:21

标签: c# wpf multithreading observablecollection

使用this代码,我得到NullReferenceException个thimethimes(10次中的4/5),这肯定是因为用于插入范围的线程不是Dispatcher线。我没有收到异常,如果我像这样包装链接文章的GetOrders方法的最后三行:

App.Current.Dispatcher.Invoke(() =>
{
    if (type == "buy") CheckNumberAndAdd(orderList, BuyOrders);
    else CheckNumberAndAdd(orderList, SellOrders);
    CheckNumberAndAdd(pendingList, PendingOrders);
});

我不想在ViewModel中使用此包装器。我希望它可以在链接的帖子中显示的AsyncObsetion<T>的实现中实现,因此我将InsertRange的{​​{1}}替换为以下内容:

AsyncObsetion<T>

使用此方法,当我从public void InsertRange(IEnumerable<T> items) { if (SynchronizationContext.Current == context) { foreach (var item in items) Items.Add(item); OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); } else { App.Current.Dispatcher.Invoke(() => { foreach (var item in items) Items.Add(item); }); context.Send(RaiseCollectionChanged, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); } } 中创建PendingOrders时,我在Pendings中得到了977个(预期)或976个(比实际少1个)项目,但我仍然得到了{ {1}}有时即使PendingOrders中有977个项目!

0 个答案:

没有答案