C# 如何处理可观的收集<&燃气轮机;MVVM中并行任务的结果?

C# 如何处理可观的收集<&燃气轮机;MVVM中并行任务的结果?,c#,multithreading,data-binding,mvvm,mvvm-light,C#,Multithreading,Data Binding,Mvvm,Mvvm Light,我在一个单独的任务中收集数据,我想使用observateCollection将结果绑定到GUI组件。我的代码是这样的: private ObservableCollection<MyItem> _items; public ObservableCollection<MyItem> Items { get { return _items; } set { if (_items.Equals(value)) { return;

我在一个单独的任务中收集数据,我想使用
observateCollection
将结果绑定到GUI组件。我的代码是这样的:

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

我将
BitmapImage
更改为
byte[]
数据类型。

能否尝试将
Dispatcher.CurrentDispatcher
替换为
Application.Current.Dispatcher
尽管您得到的异常(“必须在与DependencyObject相同的线程上创建DependencySource”)指示正在后台线程上创建并在UI线程上使用的内容。集合中是否正在创建和存储任何UI控件以供UI使用


我看到ObservableCollection本身是在后台线程上创建的,但我认为这不是问题所在——不幸的是,我不在办公室编写代码并确认这一点。

好吧,我会倒霉的。我没有意识到区别。谢谢。在将代码更改为更好的调用模式(请参阅更新)之后,你的建议不再有效。如果你的任务应该在后台进行,这样就不会锁定UI,那么你做的第一件事就是调用UI线程,这会不会在htmlParser获取数据时阻止所有UI输入?@Martin,你提出了一个很好的观点。当我把问题放在一起时,我很快简化了代码。我现在用更好的代码流更新了这个问题。正确。在MyItem类中,我有一个BitmapImage属性,它最终从DependencyObject类继承。将其改为byte[]数据类型解决了这个问题。
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; }
}