0

ObservableCollectionにバインドされたListBoxがあります。コレクション内のアイテムはそれぞれ、そのステップを実行するためのメソッドを持つ異なるステップを示します。私がやりたいのは、コレクションを介してBackgroundWorkerループを作成し、各アイテムのアクションメソッドを実行して、現在のステップをListBoxに反映させることです。

私の最初の反復はスレッド化を使用せず、ステップを実行するためだけのものでした。これで、ListCollectionViewを作成し、ObservableCollection内のデータを表すように設定し、ObservableCollectionの代わりにListBoxのItemsSourceをバインドしました。CurrentItemを明示的にインクリメントしているにもかかわらず、手順を実行するとUIスレッドの更新がブロックされることに気付きました。

BackgroundWorker内でListCollectionViewを使用したいのですが、私が見つけたほとんどの例は、リストの内容を変更したり、リストを並べ替えたりすることを前提に書かれています。私はこれをしたくありません。反復ごとにCurrentItemをインクリメントしたいだけです。単に参照するだけでは、UIスレッドの項目に関連付けられており、コンパイラーが文句を言うので、それほど遠くはありません。任意の考えやポインタをいただければ幸いです。

4

2 に答える 2

1

コンパイラからの苦情は表示されないはずですが、バックグラウンドスレッドからINotifyPropertyChanged PropertyChangeを起動するものを更新しようとすると、実行時に例外が発生します。これを回避する方法はいくつかあります。Dispatcher.Current.Invokeを使用して、DoWorkメソッド内から更新を行うことができます。ProgressChangedハンドラー(呼び出しスレッドで実行)を介して何かをリグし、完了したステップごとにReportProgressを呼び出すことができます。または、RunWorkerCompletedハンドラー(呼び出しスレッドでも実行)で更新を実行し、前の完了したハンドラーからトリガーされる一連の連続したBackgroundWorker呼び出しを使用することもできます(これは、汎用キューまたは同様のもの)。

于 2010-08-25T00:11:47.480 に答える
0

WPFクロススレッドコレクションバインディング–パート4 –グランドソリューションと私が思うソースはQuantumBitDesigns.Coreにあることを確認する必要があります

これにより、別のスレッドからリストを更新し、その変更をバインド可能な監視可能なコレクションに自動的に反映させることができます。

Observableコレクションを更新する複数のスレッド
図:デモアプリは、単一のObservableCollectionに対する複数の更新を示しています

私はこれを複数のプロジェクトで使用し、素晴らしい結果を得ました。

于 2010-08-25T00:26:56.607 に答える