Платформа: WPF, .NET 4.0, C# 4.0
Проблема: в Mainwindow.xaml у меня есть ListBox, связанный с коллекцией Customer, которая в настоящее время является ObservableCollection .
ObservableCollection<Customer> c = new ObservableCollection<Customer>();
Эта коллекция может обновляться через несколько источников, таких как FileSystem, WebService и т. Д.
Чтобы разрешить параллельную загрузку клиентов, я создал вспомогательный класс
public class CustomerManager(ref ObsevableCollection<Customer> cust)
, который внутренне порождает новую задачу (из библиотеки расширений Parallel) для каждого источника клиента и добавляет новый экземпляр Customer в объект коллекции клиентов (передается с помощью ref в его ctor).
Проблема в том, что ObservableCollection (или любая коллекция в этом отношении) не может использоваться из вызовов, отличных от потока пользовательского интерфейса, и возникает исключение:
"NotSupportedException - этот тип CollectionView не поддерживает изменения в его SourceCollection из потока, отличного от потока Dispatcher."
Я пытался использовать
System.Collections.Concurrent.ConcurrentBag<Customer>
коллекция, но она не реализует интерфейс INotifyCollectionChanged. Следовательно, мой интерфейс WPF не будет обновляться автоматически.
Итак, есть ли класс коллекции, который реализует как уведомления об изменениях свойств / коллекций, так и разрешает вызовы из других потоков, не относящихся к пользовательскому интерфейсу?
По моему первоначальному бингу / поиску в Google ничего не предусмотрено из коробки.
Редактировать: я создал свою собственную коллекцию, которая наследуется от ConcurrentBag , а также реализует интерфейс INotifyCollectionChanged . Но, к моему удивлению, даже после вызова его в отдельных задачах пользовательский интерфейс WPF зависает до тех пор, пока задача не будет завершена. Разве задачи не должны выполняться параллельно и не блокировать поток пользовательского интерфейса ?
Заранее спасибо за любые предложения.