CollectionChanged уведомления по всем потокам? - PullRequest
2 голосов
/ 07 мая 2010

Я пишу менеджер загрузок с использованием C # / WPF, и я только что столкнулся с этой ошибкой:

Этот тип CollectionView не поддерживает изменения в его SourceCollection из потока, отличного от потока Dispatcher.

Основной поток моей программы заключается в том, что несколько веб-страниц / загрузок ставятся в очередь в начале, а затем загружаются асинхронно. Когда загрузка HTML-страницы завершена, я анализирую ее и ищу дополнительные материалы для загрузки, а затем ставлю их в очередь прямо из рабочего потока.

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

Какие у меня варианты?

Ответы [ 3 ]

2 голосов
/ 07 мая 2010

Возможно, вы захотите взглянуть на Reactive Extensions от Microsoft, они предназначены именно для такого рода вещей. Они создают «наблюдаемые коллекции» и полезны в параллельных и многоядерных сценариях.

UPDATE:

Вы также можете найти SyncronizationContext полезным. Это образец Windows Forms, но есть и варианты для WPF.

1 голос
/ 07 мая 2010

Всякий раз, когда мне приходилось иметь дело с уведомлениями об изменениях коллекций между потоками, я всегда обращался к Как я могу распространять изменения по потокам Статья в блоге за помощью.

Я не уверен из контекста вашего вопроса, может ли это действительно помочь вам, но если ваша коллекция - это то, что вы непосредственно контролируете, вы можете извлечь из этого пользу.

1 голос
/ 07 мая 2010

Вам просто нужно убедиться, что вы используете Dispatcher для соответствующего потока, чтобы вызвать любой код, который обновляет коллекцию или вызывает событие.

http://msdn.microsoft.com/en-us/magazine/cc163328.aspx

Обновление

Dispatcher - это свойство всех классов, производных от DispatcherObject, которое включает в себя все DependencyObjects, Visuals и т. Д.

Итак, все ваши объекты GUI будут иметь свойство Dispatcher.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...