ObservableCollection y roscado

Tengo una ObservableCollection en mi clase. Y más adentro de mi clase tengo un hilo. De este hilo me gustaría agregar a mi ObservableCollection . Pero no puedo hacer esto:

Este tipo de CollectionView no admite cambios en su SourceCollection de un hilo diferente del hilo Dispatcher.

Tenga en cuenta que esto no está sucediendo en el hilo de la interfaz de usuario, por lo que no tengo acceso al despachador.

El enfoque de JaredPar es válido. Otro enfoque que vale la pena considerar es utilizar un ObservableCollection seguro para subprocesos en lugar de la ObservableCollection incorporada. Hay algunas implementaciones, pero la implementación de Sasha Barber y la clase CLinq Continuous Collection son algunas de las mejores en mi opinión. Internamente, estas clases usan esencialmente el enfoque descrito por JaredPar, pero lo encapsulan dentro de la clase de colección.

La mejor manera de resolver esto es pasar el objeto Dispatcher al método de inicio del hilo de fondo.

 void DoBackgroundOperation(ObservableCollection col) { var dispatcher = Dispatcher.CurrentDispatcher; ThreadStart start = () => BackgroundStart(dispatcher, col); var t = new Thread(start); t.Start(); } private static void BackgroundStart( Dispatcher dispatcher, ObservableCollection col) { ... SomeType t = GetSomeTypeObject(); Action del = () => col.Add(t); dispatcher.Invoke(del); } 

Ahora, más adelante, cuando necesite agregar a la colección, puede usar el objeto Dispatcher la interfaz de usuario.

Como señaló @Reed, se obtiene una solución más general utilizando SynchronizationContext . Aquí hay una muestra de estilo funcional que usa SynchronizationContext para crear un delegado responsable de agregar nuevos valores. Esto tiene la ventaja de ocultar tanto la colección como el modelo de subprocesamiento desde el código que crea el objeto.

 void DoBackgroundOperation(ObservableCollection col) { var context = SynchronizationContext.Current; Action addFunc = (SomeType st) => context.Send(() => col.Add(st), null); ThreadStart start = () => BackgroundStart(addFunc); var t = new Thread(start); t.Start(); } private static void BackgroundStart(Action addFunc) { ... SomeType t = GetSomeTypeObject(); addFunc(t); } 

In.Net 4.5, puede usar las colecciones Thread-safe, ConcurrentDictionary, ConcurrentBag, etc., según sus necesidades: http://msdn.microsoft.com/en-us/library/dd997305.aspx

Considere leer también: http://www.codeproject.com/Articles/208361/Concurrent-Observable-Collection-Dictionary-and-So