2010-09-02 10 views
6

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[].

+0

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? –

+0

@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. –

Respuesta

1

La excepción que está recibiendo ("Debe crear DependencySource en la misma rosca que DependencyObject") indica que algo está siendo creado en un subproceso en segundo plano y utilizado en el hilo de la interfaz de usuario. ¿Hay algún control de interfaz de usuario que se esté creando y almacenando en la colección para que lo use la UI?

Veo que el ObservableCollection en sí se está creando en un hilo de fondo, pero no creo que ese sea el problema, desafortunadamente no estoy en la oficina para codificar y confirmar eso.

+0

Correcto. En mi clase MyItem tenía una propiedad BitmapImage, que al final hereda de la clase DependencyObject. Cambiar el tipo de datos a byte [] en su lugar solucionó el problema. –

4

¿Se puede tratar de reemplazar el Dispatcher.CurrentDispatcher en Application.Current.Dispatcher no está seguro acerca de esto, sin embargo

+0

Bueno, seré maldito. No me di cuenta de la diferencia. Gracias. –

+0

Me alegro de ser de ayuda –

+0

Después de cambiar el código a un patrón Invoke mucho mejor (ver la actualización), su sugerencia no funcionó más. –

Cuestiones relacionadas