Удалите объекты ObservableCollection из разных загадок - PullRequest
0 голосов
/ 04 марта 2011

Я использую реализацию ObservableCollection, которая позволяет создавать / обновлять / удалять элементы коллекции из потока, отличного от потока пользовательского интерфейса. Все работает отлично, за исключением того момента, когда я обновляю коллекцию из пользовательского интерфейса, я больше не могу удалять ее элементы из другого потока.

Реализация ObservableCollectionEx взята из: http://geekswithblogs.net/NewThingsILearned/archive/2008/01/16/have-worker-thread-update-observablecollection-that-is-bound-to-a.aspx

Пожалуйста, помогите! Спасибо

РЕДАКТИРОВАТЬ:

Ok. Чтобы прояснить ситуацию: я реализую ObservableCollection с синхронизацией контекста. Это означает, что когда я добавляю / удаляю / обновляю элемент в коллекции, я соответственно делаю то же самое в ObjectContext. Когда я проверил свое исключение, я увидел, что оно возникает при вызове метода ObjectContext.DeleteObject () после обновления элемента из потока пользовательского интерфейса. Так что это в основном не имеет ничего общего с ObservableCollection, но с самим ObjectContext. Исключение, однако, идентично исключению, которое я впервые получил при попытке удалить элемент в коллекции из другого потока (исключение: « Этот тип CollectionView не поддерживает изменения в свой SourceCollection из потока, отличного от потока Dispatcher".

Участок утолщается ...

Большое спасибо ...

Ответы [ 2 ]

1 голос
/ 04 марта 2011

Вы уверены, что проблема в этом?

Следующий код работает нормально:

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

Не могли бы вы предоставить код, где произошла ошибка? Кроме того, непонятно, что именно не так? Получили ли вы какие-либо исключения, или удаление в рабочем потоке не изменило коллекцию или неправильно изменило коллекцию, или ваш код даже завис?

0 голосов
/ 07 марта 2011

Решение вышеизложенного состоит в том, чтобы выполнить удаление объекта в контексте в Dispatcher.Invoke:

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

Это лучше описано по следующей ссылке: http://social.msdn.microsoft.com/Forums/en/wpf/thread/793ebe28-2bba-4324-ba70-7a561a695b2e

Спасибо

...