Actualmente estoy diseñando/reelaborando la parte de enlace de datos de una aplicación que hace un uso intensivo de enlaces de datos de winforms y actualizaciones provenientes de un hilo de fondo (una vez por segundo en> 100 registros).WinForms escenario de enlace de datos de múltiples hilos, mejor práctica?
Supongamos que la aplicación es una aplicación de comercio de acciones, donde un hilo de fondo supervisa los cambios de datos y los coloca en los objetos de datos. Estos objetos se almacenan en un BindingList<>
e implementan INotifyPropertyChanged
para propagar los cambios a través de enlace de datos a los controles de winforms. Además, los objetos de datos actualmente están coordinando los cambios a través del WinformsSynchronizationContext.Send
con el subproceso de la interfaz de usuario. El usuario puede ingresar algunos de los valores en la interfaz de usuario, lo que significa que algunos valores se pueden cambiar desde ambos lados. Y los valores del usuario no deben sobrescribirse por las actualizaciones.
por lo que hay varias pregunta viene a la mente:
- ¿Hay un diseño de guildline general de cómo hacer eso (actualizaciones en segundo plano en el enlace de datos)?
- ¿Cuándo y cómo realizar una reunión en el hilo de la interfaz de usuario?
- ¿Cuál es la mejor forma de que el hilo de fondo interactúe con binding/data objects?
- ¿Qué clases/interfaces deben usarse? (BindingSource, ...)
- ...
La interfaz de usuario en realidad no saben que hay un hilo de fondo, que actualiza el control, ya partir de mi entendimiento en los escenarios de enlace de datos de la interfaz de usuario no deben' sé de dónde provienen los datos ... Puedes pensar en el hilo de fondo como algo que empuja los datos a la interfaz de usuario, así que no estoy seguro si el backgroundworker es la opción que estoy buscando.
A veces desea obtener alguna respuesta de IU durante una operación en el objeto de datos/negocio (por ejemplo, establecer el fondo durante los nuevos cálculos). No basta con aumentar una propiedad modificada en una propiedad de estado que está vinculada al fondo, ya que el control se vuelve a pintar después de que el cálculo ha finalizado. Mi idea sería enlazar el evento propertychanged y llamar a .update() en el control ... ¿Alguna otra idea al respecto?
System.ComponentModel.BackgroundWorker, puede ser parte de la solución, sin embargo, el problema difícil es cómo mantener los datos de actualizaciones rápidas sin mirar el hilo de interfaz de usuario. Hacer lo anterior sin tener que tener ninguna otra línea de código que tenga que pensar en bloquear o cruzar llamadas de hilo. –
Si nos fijamos en el Backgroundworker, no hay mucha diferencia en generar un thread y Marshal con WindowsFormsSynchronizationContext, el BW hace lo mismo. –
Consulte la edición de la respuesta. – Dun3