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 はNameプロパティとValueプロパティだけで非常に単純です。

私のViewModelでは:

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);
    }
}

これは、UI スレッドで DataCollector.GetEnumerator() から生成Must create DependencySource on same Thread as the DependencyObject.
する を作成する必要があるということですか? DataTypeどうすればこれを回避できますか?

4

3 に答える 3

0

BackGroundWorker ReportProgess でオブジェクト (ObservableCollection) を返すことができます

BackgroundWorker.ReportProgress メソッド (Int32, Object)

一度に 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 に答える
0

.NET 4.5 にアップグレードできる場合、そのバージョンの WPF の改善点の 1 つは、バックグラウンド スレッドでコレクションを変更できることです。詳しくはこちらをご覧ください。

Dispatcher.BeginInvokeそれ以外の場合は、以前は、またはDispatcher.Invokeまたは 別の同期メカニズムを使用して、UI スレッドでコレクションのみを変更するようにしてください。

于 2013-03-28T18:29:56.767 に答える