En mi aplicación wpf, se llama a una operación que consume mucho tiempo en mi viewmodel usando un subproceso independiente. Esta función, sin embargo, accede a varias propiedades en el modelo de vista que están vinculadas a objetos en la vista. Traté de acceder a ellos directamente y no veo quejas sobre que sean propiedad del hilo de la interfaz de usuario. Estoy interesado en conocer las consecuencias de usarlos directamente entre hilos.Acceso a las propiedades de ViewModel desde un subproceso diferente
Respuesta
Puede usar su ViewModel desde cualquier hilo, incluidos la lectura y la escritura. La única excepción principal es tratar con colecciones: las colecciones vinculadas a datos deben escribirse en el subproceso de la interfaz del usuario, ya que el enlace no se asigna automáticamente al hilo de la interfaz de usuario (como lo hacen los enlaces simples).
Sin embargo, aún debe considerar tener una sincronización adecuada para cualquier escritura. Se producirán problemas normales de sincronización de subprocesos, ya que ViewModel es solo otra clase.
Habiendo dicho esto, normalmente, querrá manejar la sincronización de forma ligeramente diferente de lo que haría en muchos casos. Normalmente, los bloqueos no funcionan en un ViewModel, ya que el enlace de datos WPF no bloqueará los objetos. Como tal, normalmente debería usar Dispatcher.Invoke
/BeginInvoke
para coordinar las llamadas al hilo de la interfaz de usuario según sea necesario cuando se requiera sincronización en ViewModel.
Como, por ejemplo, si tengo un 'ToggleButton' vinculado a un' bool' en la máquina virtual. Y estoy haciendo un 'if (bool)' en un hilo separado, ¿qué tendré que hacer para mantener la sincronización aquí para que no exista conflicto entre el usuario que configura el alternar y la condición if que se está ejecutando? – Aks
@Aks No. Si solo está leyendo un valor como ese, no tendrá problemas. Dicho esto, probablemente (técnicamente) marque el bool volátil. Para obtener detalles, consulte: http://stackoverflow.com/questions/458173/can-ac-sharp-thread-really-cache-a-value-and-ignore-changes-to-that-value-on-ot/458193 # 458193 –
No hay consecuencias aparte de sus preocupaciones de seguridad de hilos habituales. Lo único que generalmente es problemático con las propiedades de VM es ObservableCollections
que tienen afinidad por el hilo.
Si tuviera que usar bloqueos, ¿no es probable que el hilo de la interfaz de usuario se cuelgue? – Aks
Esto es cierto, pero las "preocupaciones de seguridad de subprocesos habituales" tienden a requerir soluciones inusuales, ya que WPF ignorará cualquier bloqueo o sincronización de subprocesos estándar que intente utilizar. –
Si utiliza ampliar su ObservableCollection con esto, se puede actualizar desde un hilo separado:
/// <summary>
/// Source: New Things I Learned
/// Title: Have worker thread update ObservableCollection that is bound to a ListCollectionView
/// http://geekswithblogs.net/NewThingsILearned/archive/2008/01/16/have-worker-thread-update-observablecollection-that-is-bound-to-a.aspx
/// Note: Improved for clarity and the following of proper coding standards.
/// </summary>
/// <param name="e"></param>
protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
{
// Use BlockReentrancy
using (BlockReentrancy())
{
var eventHandler = CollectionChanged;
// Only proceed if handler exists.
if (eventHandler != null)
{
Delegate[] delegates = eventHandler.GetInvocationList();
// Walk thru invocation list
foreach (NotifyCollectionChangedEventHandler handler in delegates)
{
var currentDispatcher = handler.Target as DispatcherObject;
// If the subscriber is a DispatcherObject and different thread
if ((currentDispatcher != null) &&
(currentDispatcher.CheckAccess() == false))
{
// Invoke handler in the target dispatcher's thread
currentDispatcher.Dispatcher.Invoke(
DispatcherPriority.DataBind, handler, this, e);
}
else
{
handler(this, e);
}
}
}
}
}
/// <summary>
/// Overridden NotifyCollectionChangedEventHandler event.
/// </summary>
public override event NotifyCollectionChangedEventHandler CollectionChanged;
- 1. acceso de subproceso diferente MemoryStream
- 2. objeto de acceso desde un hilo diferente
- 3. Cómo excluir las propiedades del ViewModel CA1811
- 4. acceso WEBrick desde un PC diferente
- 5. Acceso a ViewModel/DataConext dentro de ContextMenu
- 6. Acceso a las propiedades de la página maestra desde las páginas secundarias en ASP.net VB
- 7. javascript acceso a propiedades
- 8. ¿Cómo uso DomainContext.Load para rellenar las propiedades de mi ViewModel?
- 9. Notificar que todas las propiedades han cambiado en ViewModel
- 10. Acceso a las propiedades del controlador de vista principal (personalizado)
- 11. ¿Puede jboss-web.xml tener acceso a las propiedades?
- 12. Acceso a las propiedades de la aplicación en Spring-MVC
- 13. ¿Tiene acceso a todas las propiedades de estilo css?
- 14. C#/WPF: PropertyChanged para todas las propiedades en ViewModel?
- 15. Generando propiedades de ViewModel en wpf?
- 16. Cómo utilizar el enlace en los elementos del ListBox a las propiedades del ViewModel
- 17. ¿Cómo se deben propagar eventos desde un ViewModel a otro ViewModel en MVVW?
- 18. La vista no encuentra ViewModel en un ensamblaje diferente
- 19. Impulsar propiedades de GUI de solo lectura en ViewModel
- 20. ¿Cómo manejar excepciones desde un subproceso BackgroundWorker?
- 21. acceso MVVM vista padre modelo desde dentro de la colección
- 22. pyserial - es posible escribir en el puerto en serie desde el subproceso a, doblo las lecturas desde el subproceso b?
- 23. Obteniendo un mapa de Scala desde las propiedades de Java
- 24. ASP.net MVC - ¿Debo usar AutoMapper desde ViewModel a las entidades de Entity Framework?
- 25. el acceso a ciertas propiedades de un objeto SimpleXMLElement
- 26. subproceso en Windows, acceso denegado
- 27. Acceso a datos compartidos desde un controlador de señal
- 28. Mejores prácticas: arrojar excepciones desde las propiedades
- 29. Evento de enlace a ViewModel
- 30. WPF View establece las propiedades de ViewModel para anular el cierre
¿Está cambiando el 'ViewModel' o simplemente leerlo hilos separados? – SliverNinja
solo hilos separados – Aks