0

私のWPFアプリでは、UIスレッドで高価な操作を実行する必要があり(それを呼び出しましょうExpensiveUIOperation())、進行状況を追跡するためにUIを最新の状態に保ちたいと思います。

進行状況を追跡するために、プロパティが整数の依存関係プロパティにバインドされているTextBlock、があります。の間に、必要に応じての値を設定するだけです。TextPercentageCompleteExpensiveUIOperation()PercentageComplete

これで、スレッドについて十分に理解しました。UIスレッドを実行ExpensiveUIOperation()しただけでは、UIスレッドがブロックされ、インターフェイスの更新が停止するため、TextBlockが最新の状態に保たれていないように見えます。

そして、私は次のように非同期でそれを行うことができると思いました:

Dispatcher.BeginInvoke(new Action(ExpensiveUIOperation), DispatcherPriority.Background);

しかし、それはまだ機能していません。操作が完了するまで、テキストブロックは視覚的に更新されません。

これを行う方法はありますか?

残念ながら、この状況では、操作でUIスレッドが所有するオブジェクトを多用するため、バックグラウンドスレッドを使用できません。

4

2 に答える 2

2

残念ながら、この状況では、操作でUIスレッドが所有するオブジェクトを多用するため、バックグラウンドスレッドを使用できません。

これは、このようなUIスレッドを悪用するのに十分な理由ではありません。これらの要素にアクセスするときにディスパッチャーを使用するか(トレッドモデルリファレンスを参照)、ビューを関連するプロパティに適切にバインドします。更新は内部でUIにキューされるため、これを行う必要はありません。

于 2011-09-05T19:51:06.887 に答える
0

行き詰まり、UI操作はUIスレッドで実行する必要があり、その間、UIの更新は行われません。新しいディスパッチャフレーム( http://dedjo.blogspot.com/2007/08/how-to-doevents-in-wpf.htmlApplication.DoEvents )を作成することで、WPFでの同等の処理を実行できますが、危険です。更新中のUIであり、実行するのは良いことではありません。

高価なUI操作は本当にCPUを集中的に使用する、UIのみの操作ですか?たとえば、ビューモデルオブジェクトグラフで実行して、最終的にUIにバインドできるものはありませんか?

于 2011-09-05T12:43:10.037 に答える