0

Entity Framework でデータベースからデータをロードするのに時間がかかる場合、UI (WPF) に "ロード中" インジケータを表示したいと考えています。インジケーター自体には、記事にあるようにWPF Loading Wait Adornerを使用しています。

インジケーターは正常に機能しますが、Entity Framework がデータを読み込むときに表示されません。その場合、インジケーターは UI にまったく表示されません。

私はこれを実行します:

'show Adorner (loading indicator)
LoadingAdorner.IsAdornerVisible = Not LoadingAdorner.IsAdornerVisible

'read data from database with Entity Framework
Persons = _context.persons

'hide Adorner (loading indicator) after loading data is completed
LoadingAdorner.IsAdornerVisible = Not LoadingAdorner.IsAdornerVisible

<ac:AdornedControl Name="LoadingAdorner">
        <ac:AdornedControl.AdornerContent>
            <local:LoadingWait></local:LoadingWait>
        </ac:AdornedControl.AdornerContent>
        <ListBox>
            ...code not shown
        </ListBox>  
</ac:AdornedControl>  

データがロードされた後にのみ、インジケーターが表示されます。不足しているものと、データのロード中にインジケーターを表示する方法は?

4

1 に答える 1

2

問題は、メイン スレッドで EF 呼び出しを実行していることです。これにより、DB からすべてのデータを受け取るまで、UI の更新がブロックされます。
これを修正するには、BackgroundWorkerメソッドを追加または非同期にするだけです。

  var worker = new BackgroundWorker();
  worker.DoWork += (s, e) => {
       this.IsLoading = true;
       this.Persons = _context.persons;
    };        
    worker.RunWorkerCompleted += (s, e) => {
       this.IsLoading = false;
    };

重要: クロススレッド アクセス (バックグラウンド スレッドで実行されるDoWork 、完了- UI スレッド)に注意してください。

最後に、 DoWorkを開始/トリガーする.RunWorkerAsync()には、ワーカーで実行する必要があります。

于 2013-10-29T14:43:53.280 に答える