Как обработать ObservableCollection <> результат параллельной задачи в MVVM? - PullRequest
6 голосов
/ 02 сентября 2010

Я собираю данные в отдельной Задаче, и я хочу, чтобы данные связывали результат с компонентом GUI, используя ObservableCollection<>. Мой код выглядит примерно так:

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;
    });
  });
}

Данные извлекаются из компонента, выполняющего некоторые HTTP-запросы. Я получаю ошибку:
Must create DependencySource on same Thread as the DependencyObject.

Я использую среду инструментария MVVM Light. Я также попытался отправить результат в виде сообщения, но в результате получилось то же сообщение об ошибке. Любые идеи или указатели?

РЕДАКТИРОВАТЬ: Вот проблема:

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; }
}

Я изменил BitmapImage на тип данных byte[].

Ответы [ 2 ]

4 голосов
/ 02 сентября 2010

Можете ли вы попробовать заменить Dispatcher.CurrentDispatcher на Application.Current.Dispatcher, хотя не уверены в этом, хотя

1 голос
/ 02 сентября 2010

Исключение, которое вы получаете («Необходимо создать DependencySource в том же потоке, что и DependencyObject»), указывает, что что-то создается в фоновом потоке и используется в потоке пользовательского интерфейса.Существуют ли какие-либо элементы управления пользовательского интерфейса, которые создаются и хранятся в коллекции для использования пользовательским интерфейсом?

Я вижу, что сама ObservableCollection создается в фоновом потоке, но я не думаю, что это проблема - к сожалениюЯ не в офисе, чтобы кодировать и подтверждать это.

...