0

私はwpfの初心者なので、正しく聞こえないものはすべてご容赦ください...

起動時にSQLデータベースから多くの(20000以上)アイテムをロードし、xaml.csビハインドファイルに作成されたObservableCollectionに保存するWPFアプリケーションがあります。

コンストラクターがスレッドを作成し、スレッドを開始し、スレッドが無限にループするクラスを作成しました。

public StatusChanged()
    {
        Thread thread = new Thread(new ThreadStart(ThreadProc));
        thread.Start();
    }

このスレッドを開始する方法は、コードの背後にあるメインウィンドウ(xaml.cs)でこのスレッドクラスのインスタンスを作成することです。

このスレッドでは、UIウィンドウが応答しなくなる原因となる可能性のあるいくつかのことを行うwhileループがあります。

  1. データベース内のアイテムのいずれかでビットフラグが変更されたかどうかを確認するSQLコマンドを実行する無限のwhileループ。何も見つからない場合、スレッドは3秒間スリープし、ループが続行されます

  2. データベースから行が返されると、すべての行をループして変更された属性を見つけ、ObservableCollectionを変更します。また、各行に対してSQLUpdateコマンドを実行してデータベースのビットフラグを変更します。その後、スレッドは再び3秒間スリープし、ループが続行されます。

これは、何が起こっているかの概要です。データベースから行が返され、ポイント2)から作業が行われている場合、UIが応答しなくなる可能性があります。ボタンをクリックしようとすると、通常は75%以上の確率で機能しますが、25%の確率でUIが応答せず、何も起こりません。これは私のアプリにとって非常に悪いことです。

私の例に基づいて、UIが応答しなくなる原因は何だと思いますか?それは可能性が...

  1. データベースによって返されるすべての行をループしているwhileループ?

  2. そのwhileループ内の監視可能なコレクションを更新します^^だけでなく、各アイテムに対してsqlupdate呼び出しを行います。

  3. スレッドが開始され、スリープ状態になり、xaml.csコードのインスタンスによって作成される方法は?

4

2 に答える 2

2

20000以上のアイテムのObservableコレクションがUIにバインドされている場合、アイテムが変更されたときにUIを更新する必要がある場合があります。これは、UIスレッドにとって非常にコストがかかり、UIが応答しなくなる可能性があります。

試すべきいくつかの提案:

  1. アイテム数を減らしましょう
  2. VirtualizingStackPanelsを使用して、UIが見えないアイテムを更新しないようにします
于 2012-09-21T19:35:59.923 に答える
0

アイテムをロードするためにPaginatorを使用することもできます。これは、大量の情報を管理するアプリに役立ちます。

于 2012-09-21T19:49:54.470 に答える