1

ディスパッチャの煩わしさ、そしてうまくいけば、それを回避する方法を知っている人もいます。

問題:UI要素またはそれらにバインドされているものはすべてDispatcherスレッドに強制/必須です。その結果、操作によってはハングタイムが発生します。私は、UI要素にバインドされたコレクションを持っており、への操作を別のスレッドで行うことはできないため、ハングタイムが差し迫っています。

この問題の解決策はありますか?

Dispatcher.Invokeまたは関連するタイプは機能しないため、返信しないでください。それらは同期しているからです。今のところ、私が本当にできることは、操作を最適化してできるだけ速く実行することですが、実際には制限されています。

4

1 に答える 1

3

実行している作業の一部はUIスレッドに含める必要がありますが、すべてがそうではない可能性があります。データをコントロールにバインドする場合は、データがすべてバックグラウンドスレッドで計算されていることを確認する必要があります。その後、UIスレッドで実行されるアクションは、既にフェッチ/計算されたデータをコントロールに適用することだけです。たとえば、IQueryableフレームワークを使用していて、クエリの結果をデータソースとしてバインドする場合、IQueryableそのクエリの結果は実際にはまだ評価されていません。結果が繰り返されていないため、データベースは実際には照会されていません。これを行うと、UIスレッドがデータベース呼び出しを行うことになりますが、これは悪いことです。

実際に大量のデータがあり、私が説明したようなことをしていないにもかかわらず、すべてのコントロールを更新するのに長い時間がかかる場合は、アプリケーションをより根本的に再設計する必要があります。これが実際に当てはまる場合は、何千行ものデータをDataGrid(またはそれらの行に沿ったもの)にバインドする必要があります。多くのデータが実際にコントロールに一度に適用されないようにするために、データをページ分割するか、それらの線に沿って何か他のことを行う必要がある場合があります。物事をより小さなデータのチャンクに分割し、それらのより小さなデータのチャンクを表示する方法を見つける必要があります。

于 2012-10-15T15:05:29.750 に答える