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