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