2010-09-02 24 views
6

我正在一个单独的任务中收集数据,并且我想要使用ObservableCollection<>将结果绑定到GUI组件。所以我的代码如下所示:如何处理MVVM中并行化任务的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; } 
} 

我改变了BitmapImagebyte[]数据类型。

+0

如果您的任务应该在后台进行,以便它不会锁定UI,那么看起来很奇怪,您所做的第一件事是回调到UI线程 - 这不会阻止所有UI输入_htmlParser正在获取数据? – 2010-09-02 09:26:53

+0

@马丁,你正在提出一个非常好的观点。当我把问题放在一起时,我很快简化了代码。我现在用更好的代码流更新了这个问题。 – 2010-09-02 10:04:02

回答

1

你得到(“必须在同一个线程中的DependencyObject创建DependencySource”)的异常指示有什么地方被在后台线程创建并在UI线程中使用。是否有任何UI控件被创建并存储在集合中供UI使用?

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

+0

正确。在我的MyItem类中,我有一个BitmapImage属性,它最终从DependencyObject类继承。将其改为byte []数据类型,而不是解决问题。 – 2010-09-02 13:17:42

4

你可以尝试更换Dispatcher.CurrentDispatcherApplication.Current.Dispatcher不知道这虽然

+0

好吧,我会死的。没有意识到差异。谢谢。 – 2010-09-02 09:22:12

+0

很乐意帮忙 – 2010-09-02 09:26:55

+0

将代码更改为更好的调用模式(请参阅更新)后,您的建议无法工作。 – 2010-09-02 10:09:27

相关问题