Estoy recopilando datos en una Tarea por separado y quiero que los datos enlacen el resultado a un componente de la GUI usando un ObservableCollection<>
. Mi código es más o menos así:¿Cómo manejar el resultado de ObservableCollection <> de una tarea paralelizada en MVVM?
private ObservableCollection<MyItem> _items;
public ObservableCollection<MyItem> Items
{
get { return _items; }
set
{
if (_items.Equals(value))
{
return;
}
_items = value;
RaisePropertyChanged("Items");
}
}
private void LoadData()
{
Task task = Task.Factory.StartNew(() =>
{
ObservableCollection<MyItem> itms = _htmlParser.FetchData(...);
Dispatcher.CurrentDispatcher.Invoke((Action)delegate
{
Items = itms;
});
});
}
Los datos se obtienen de un componente que realiza algunas solicitudes HTTP. El error que estoy recibiendo es:
Must create DependencySource on same Thread as the DependencyObject.
Estoy utilizando el marco de herramientas MVVM Light. También traté de enviar el resultado como un mensaje, pero eso terminó en el mismo mensaje de error. Alguna idea o punteros?
EDIT: He aquí el problema:
public class MyItem
{
public string Id { get; set; }
public string Name { get; set; }
public BitmapImage Image { get; set; } // <--- A big No No because it inherits from the DependencyObject
public Uri Uri { get; set; }
}
he cambiado el BitmapImage
a un tipo de datos byte[]
.
Si se supone que su tarea está sucediendo en segundo plano para que no bloquee la interfaz de usuario, parece extraño que lo primero que haga es invocar de nuevo al subproceso de la interfaz de usuario: ¿esto no bloqueará todas las entradas UI mientras ¿_htmlParser está buscando los datos? –
@Martin, estás planteando un muy buen punto. Cuando hice la pregunta, simplifiqué rápidamente el código. Ahora he actualizado la pregunta con un mejor flujo de código. –