从不同的线程之谜中删除ObservableCollection项

时间:2011-03-04 10:55:44

标签: wpf wpf-controls binding prism

我正在使用一个ObservableCollection实现,它允许从与UI线程不同的线程创建/更新/删除集合项。一切正常,除非我从UI更新集合时,我不能再从不同的线程中删除它的项目。

ObservableCollectionEx实现取自:http://geekswithblogs.net/NewThingsILearned/archive/2008/01/16/have-worker-thread-update-observablecollection-that-is-bound-to-a.aspx

请帮忙! 感谢

编辑:

确定。要清理一下:我正在实现一个带有上下文同步的ObservableCollection。这意味着当我在集合上添加/删除/更新项目时,我相应地在ObjectContext上执行相同的操作。当我检查我的异常时,我看到它是在从UI线程更新项目后调用ObjectContext.DeleteObject()方法时引发的。所以它基本上与ObservableCollection无关,而是与ObjectContext本身无关。例外情况与我在尝试从另一个线程中删除集合上的项目时遇到的异常相同(例外情况是:“此类型的CollectionView不支持从与Dispatcher线程不同的线程更改其SourceCollection “。

情节变浓......

非常感谢...

2 个答案:

答案 0 :(得分:1)

你确定问题出在那吗?

下一个代码可以正常工作:

        private readonly ObservableCollectionEx<int> collection = new ObservableCollectionEx<int>();

        public MainWindow()
        {
            InitializeComponent();

            this.collection.Add(30);
            this.collection.Add(50);
            this.collection.Add(70);

            new Thread(() =>
            {
                this.collection.Add(100);
            }).Start();

            new Thread(() =>
            {
                this.collection.Add(110);
                this.collection.Add(120);
            }).Start();

// Update and delete in UI thread
            this.collection.Remove(30);
            this.collection[0] = 1130;

            new Thread(() =>
            {
// Delete in worker thread after modification in UI thread
                this.collection.Remove(1130);
            }).Start();
        }

你能提供一些错误发生的代码吗? 此外,还不清楚到底出了什么问题?您是否有任何异常或工作线程中的删除没有更改集合或它已经错误地更改了集合或您的代码甚至挂了?

答案 1 :(得分:0)

上述解决方案是在Dispatcher.Invoke中对上下文执行删除对象:

Dispatcher.Invoke(new Action(() =>
        { 
             context.DeleteObject(obj);
        }));

以下链接更好地描述了:http://social.msdn.microsoft.com/Forums/en/wpf/thread/793ebe28-2bba-4324-ba70-7a561a695b2e

由于