How to handle ObservableCollection<> result from a parallelized Task in MVVM?

可紊 提交于 2019-12-07 03:46:17

问题


I am gathering data in a separate Task and I want to data bind the result to a GUI component using an ObservableCollection<>. So my code goes something like this:

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

The data is fetched from a component doing some HTTP requests. The error I am getting is:
Must create DependencySource on same Thread as the DependencyObject.

I am using the MVVM Light toolkit framework. I also tried to send the result as a message, but that ended up in the same error message. Any ideas or pointers?

EDIT: Here's the issue:

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

I changed the BitmapImage to a byte[] data type.


回答1:


The exception you're getting ("Must create DependencySource on same Thread as the DependencyObject") indicates that something's being created on a background thread and used on the UI thread. Are there any UI controls being created and stored in the collection for use by the UI?

I see that the ObservableCollection itself is being created on a background thread, but I don't think that's the issue -- unfortunately I'm not in the office to code and confirm that.




回答2:


Can you try to replace the Dispatcher.CurrentDispatcher into Application.Current.Dispatcher not sure about this though



来源:https://stackoverflow.com/questions/3625581/how-to-handle-observablecollection-result-from-a-parallelized-task-in-mvvm

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!