Estoy usando MVVM Light para construir una aplicación WP7 (Windows Phone 7). Deseo que todo el trabajo realizado por el Modelo se ejecute en un hilo de fondo. Luego, cuando el trabajo esté terminado, plantee un evento para que ViewModel pueda procesar los datos.¿Cómo ejecutar una función en una cadena de fondo para Windows Phone 7?
Ya he descubierto que no puedo invocar a un delegado de forma asincrónica desde una aplicación WP7.
Actualmente estoy tratando de utilizar ThreadPool.QueueUserWorkItem() para ejecutar un código en un subproceso en segundo plano y usar DispatcherHelper.CheckBeginInvodeOnUI de MVVM Light() para generar un evento en el subproceso de interfaz de usuario para indicar el modelo de vista que los datos han sido cargados (Esto bloquea VS2010 y Blend 4 cuando intentan mostrar una vista en tiempo de diseño).
¿Hay algún código de muestra para ejecutar algún código en una cadena de fondo y luego enviar un evento de vuelta al subproceso de interfaz de usuario para una aplicación WP7?
Gracias de antemano, Jeff.
Editar - He aquí una muestra de Modelo
public class DataModel
{
public event EventHandler<DataLoadingEventArgs> DataLoadingComplete;
public event EventHandler<DataLoadingErrorEventArgs> DataLoadingError;
List<Data> _dataCasch = new List<Data>();
public void GetData()
{
ThreadPool.QueueUserWorkItem(func =>
{
try
{
LoadData();
if (DataLoadingComplete != null)
{
//Dispatch complete event back to the UI thread
DispatcherHelper.CheckBeginInvokeOnUI(() =>
{
//raise event
DataLoadingComplete(this, new DataLoadingEventArgs(_dataCasch));
});
}
}
catch (Exception ex)
{
if (DataLoadingError != null)
{
//Dispatch error event back to the UI thread
DispatcherHelper.CheckBeginInvokeOnUI(() =>
{
//raise error
DataLoadingError(this, new DataLoadingErrorEventArgs(ex));
});
}
}
});
}
private void LoadData()
{
//Do work to load data....
}
}
No olvide comprobar las implicaciones del rendimiento de utilizar barras de progreso indeterminadas: http://www.jeff.wilcox.name/2010/08/progressbarperftips2/ –
Definir definitivamente IsDeterminte = False cuando no estén visibles. – Micah
La fuente de SafeDispatch estaría bien. – Sam