2013-03-28 47 views
1

我正在使用繼承IEnumerable的類來檢索DataType的集合。在另一個線程中填充ObservableCollection

class DataCollector : IEnumerable<DataType> 
{ 
    public IEnumerator<DataType> GetEnumerator() 
    { 
     // this takes from 5 to 20 seconds, 
     // so I want it to run in a background thread. 
    } 
} 

現在數據類型是隻是一個名稱價值屬性很簡單。

在我的ViewModel:

private AsyncObservableCollection<DataType> _Data = new AsyncObservableCollection<DataType>(); 

我使用的是從hereAsyncObservableCollection,所以我可以從BackgroundWorker的填充它。

在視圖模型的構造函數創建一個BackgroundWorker,這是DoWork的:

void DoWork(object sender, DoWorkEventArgs e) 
{ 
    var data = new DataCollector(); 
    foreach (var i in data) 
    { 
     _Data.Add(i); 
    } 
} 

我越來越Must create DependencySource on same Thread as the DependencyObject.
這是否意味着我需要創建我是從DataCollector.GetEnumerator產生的DataType( )在UI線程?我怎樣才能解決這個問題?

回答

0

爲什麼不等待整個事情完成,然後編組插入的項目到UI線程?

void BackgroundWorker_Completed(ect... Im not used to work with BW so I don't know the parameters) 
{ 
    _Data.AddRange(yourdataItems); 
} 

編輯

如果要逐步填充的ObservableCollection:

void DoWork(object sender, DoWorkEventArgs e) 
{ 
    var data = new Datacollector(); 
    foreach (var i in data) 
    { 
     Application.Current.Dispatcher.BeginInvoke((Action)(_Data.Add(i))); 
    } 
} 
+0

我試圖讓它在加載數據時更新UI。 – Josh

+0

@Josh看我的編輯。 –

+0

不幸的是,似乎並沒有解決'必須在DependencyObject.'異常的同一線程上創建DependencySource。 – Josh

0

如果你已經升級到.NET 4.5,的改進WPF一的能力該版本是修改後臺線程集合的能力。有關更多信息,請參見here

否則,在之前您應該嘗試僅通過使用Dispatcher.BeginInvokeDispatcher.Invoke或其他同步機制來修改UI線程上的集合。

相關問題