Existe uma coleção Observável Threadsafe no .NET 4?
Plataforma:WPF, .NET 4.0, C# 4.0
Problema: No Mainwindow.xaml, tenho um ListBox vinculado a uma coleção Customer, que atualmente é um ObservableCollection <Customer>.
ObservableCollection<Customer> c = new ObservableCollection<Customer>();
Esta coleção pode ser atualizada através de várias fontes, como FileSystem, WebService etc.
Para permitir o carregamento paralelo de clientes, criei uma classe auxiliar
public class CustomerManager(ref ObsevableCollection<Customer> cust)
que gera internamente uma nova tarefa (da biblioteca de extensões paralelas) para cada origem do cliente e adiciona uma nova instância do cliente ao objeto de coleção do cliente (passado por ref ao seu ctor).
O problema é que ObservableCollection <T> (ou qualquer coleção para esse assunto) não pode ser usado em chamadas que não sejam o thread da interface do usuário e uma exceção é encontrada:
"NotSupportedException - este tipo de CollectionView não suporta alterações no SourceCollection de um thread diferente do thread do Dispatcher."
Eu tentei usar o
System.Collections.Concurrent.ConcurrentBag<Customer>
coleção, mas não implementa a interface INotifyCollectionChanged. Portanto, minha interface do WPF não será atualizada automaticamente.
Portanto, existe uma classe de coleção que implementa as notificações de alteração de propriedade / coleção e também permite chamadas de outros segmentos que não sejam da interface do usuário?
Pela minha bing / googling inicial, não há nenhum fornecido fora da caixa.
Editar: eu criei minha própria coleção que herda deConcurrentBag <Cliente> e também implementa oINotifyCollectionChanged interface. Mas, para minha surpresa, mesmo depois de invocá-lo em tarefas separadas, a interface do usuário do WPF trava até a tarefa ser concluída.As tarefas não devem ser executadas em paralelo e não bloqueiam o thread da interface do usuário?
Obrigado por todas as sugestões, com antecedência.