[C#] Actualizar un ObservableCollection en un hilo separado


Answers

.Net 4.5 proporciona una solución dentro de la clase BindingOperations.

Ahora puede usar el método BindingOperations.EnableCollectionSynchronization de la siguiente manera:

private readonly object _personCollectionLock;
private ObservableCollection<Person> _personCollection;

public ObservableCollection<Person> PersonCollection
{
  get { return _personCollection; }
  set
  { 
    _personCollection = value;
    BindingOperations.EnableCollectionSynchronization(_personCollection, _personCollectionLock);
  }

Acabo de probar esto en mi entorno de desarrollo, pero parece que todo funciona correctamente ahora cuando actualizo la colección desde un hilo de fondo.

Hay una discusión más profunda de esta solución en: http://10rem.net/blog/2012/01/16/wpf-45-observable-collection-cross-thread-change-notification

La entrada de MSDN para este método está en: https://msdn.microsoft.com/en-us/library/system.windows.data.bindingoperations.enablecollectionsynchronization(v=vs.110).aspx

Question

En una aplicación de WPF, las consultas de LINQ a SQL rellenan y actualizan ObservableCollection. Luego, los objetos de UI se actualizan utilizando los valores de este ObservableCollection.

¿Es posible y razonable que las operaciones de actualización de este ObservableCollection de LINQ a SQL se hayan ejecutado en un hilo separado?

En caso afirmativo, será, en este caso, una y la misma instancia de este ObservableCollection? (Quiero decir, si no es el mismo para tomar valores del contexto de datos LINQ y el de dar valores para actualizar la IU, entonces no podré actualizar la IU)




Intentando entender tu pregunta aquí:

Scenario 1
1. LINQ to SQL retrieves data set from database and adds to ObservableCollection A.
2. Periodically, more data is retrieved from database and added to A. Old data is removed from A.

Scenario 2
1. LINQ to SQL retrieves data set from database and adds to ObservableCollection A.
2. Periodically, data in A is updated with new data from database (no add/remove).

Con el Escenario 1, vas a tener que usar el hilo de UI. El hilo de UI posee el ObservableCollection y obtendrá una excepción si intenta usarlo en otro hilo.

Con el Escenario 2, pulgares arriba. Siempre que no intente agregar o quitar elementos de la colección en sí, puede actualizar el elemento tanto como desee en una cadena de fondo.




Links