Есть ли в .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 зависает до тех пор, пока задача не будет завершена.Разве задачи не должны выполняться параллельно и не блокировать поток пользовательского интерфейса??

Спасибо за любые предложения, заранее.

Ответы на вопрос(4)

Ваш ответ на вопрос