2013-03-28 66 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线程上的集合。

相关问题