1

我正在使用一个继承 IEnumerable 的类来检索DataType.

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

现在 DataType 非常简单,只有一个NameValue属性。

在我的视图模型中:

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

AsyncObservableCollection这里使用,所以我可以从 BackgroundWorker 填充它。

ViewModel 中的构造函数创建了一个 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.
这是否意味着我需要DataType在 UI 线程中创建从 DataCollector.GetEnumerator() 产生的内容?我怎样才能解决这个问题?

4

3 回答 3

0

If you have the capability to upgrade to .NET 4.5, one of the improvements to WPF for that version is the ability to modify collections on background threads. See here for more information.

Otherwise, in previous you should probably attempt to only modify the collection on the UI thread, through the use of Dispatcher.BeginInvoke or Dispatcher.Invoke or another synchronization mechanism.

于 2013-03-28T18:29:56.767 回答
0

您可以使用 BackGroundWorker ReportProgess 将对象 (ObservableCollection) 传回

BackgroundWorker.ReportProgress 方法(Int32,对象)

一次传回 100 或 1000 行。
或者只是传回前 1000 个,然后等待完成获得总数。

于 2013-03-28T20:22:07.047 回答
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)));
    }
}
于 2013-03-28T18:19:42.167 回答