別のスレッドでいくつかのデータをロードしようとしています。次に、ロードされたデータをObservableCollectionに追加し、baバインディングを介してビューを更新します。
最初に、私は次のことをしていました:
public OverviewViewModel()
{
Thread thread = new Thread(new ThreadStart(delegate
{
TheTVDB theTvdb = new TheTVDB();
foreach (TVSeries tvSeries in theTvdb.SearchSeries("Dexter"))
{
this.Overview.Add(tvSeries);
}
}));
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
}
これにより、次のエラーが発生しました。
このタイプのCollectionViewは、Dispatcherスレッドとは異なるスレッドからのSourceCollectionへの変更をサポートしていません。
それで、私はこのフォーラムでディスパッチャーを使用する必要があることを読んだので、ディスパッチャーにthis.Overview.Add(tvSeries)
電話をかけました。
Dispatcher.CurrentDispatcher.BeginInvoke((Action)delegate
{
this.Overview.Add(tvSeries);
},
DispatcherPriority.Normal);
これで、クラッシュしなくなりましたが、ビューは更新されません。何も起こりません。ビューは空です。メインスレッドで実行して機能をテストしました。その後、ビューが正しく更新されます。
ビューが更新されない理由と、これを修正する方法を知っている人はいますか?
アップデート
以下のアプローチは機能しているようで、すべてを非同期的に実行しているようです。これが非同期的に物事を行うための正しいアプローチであることを誰かが確認できますか?
Dispatcher.CurrentDispatcher.BeginInvoke(new Action(delegate
{
TheTVDB theTvdb = new TheTVDB();
foreach (TVSeries tvSeries in theTvdb.SearchSeries("Dexter"))
{
this.Overview.Add(tvSeries);
}
}),
DispatcherPriority.Background);