2010-09-02 21 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

相關問題