2011-09-19 7 views
0

私のアプリケーションでは、TabItemを読み込むときにパフォーマンスに問題があります(各TabItemはViewModelにバインドされ、各ViewModelにはDataTemplateがあります)。この問題を解決するために、私はViewModelにコンストラクタでの非同期読み込みを使用します。このソリューションにより非同期の最初のTabItemの読み込みでのパフォーマンスの問題

public MyViewModel(MyObject entity) 
    { 
     // WpfContext it's my Dispatcher 
     Task.Factory.StartNew(() => WpfContext.Invoke(() => 
            { 
             //Initialisation 
             LoadMyObject(entity); 
            })); 
    } 

を、のTabItemがロードされる最初の時間は、それはいくつかの時間がかかり、実際には非同期ではないようです。その他の負荷では、正常に動作し、非同期に動作します。なぜ私は正確に分からない。なにか提案を ?

答えて

1

Invoke Dispatcherは、タスクのバックグラウンドスレッドとUIスレッド(実際にコードを実行することを決定した後)のブロッキングコールです。

UIスレッドが新しいタブを表示するためにビジー状態になることがあり、UIスレッドが処理するまでにバックグラウンドスレッドのInvokeがブロックされているために、時々非同期に見えます。同期しているように見える場合、の前に、UIスレッドによってInvoke呼び出しが処理されています。新しいタブが表示されています。ですから、結局、あなたは競争状態にあると思います。

これを解決するには、新しいタブの表示を確実にするために、それがバックグラウンドスレッド上で実行することができますので、あなたのLoadMyObjectメソッドをリファクタリングする必要があるかもしれませんか、Dispatcher.BeginInvokeメソッドを使用することができますし、それを低い優先順位を提供し、処理の前にLoadMyObjectコール

+0

"あなたのLoadMyObjectをリファクタリングする必要があるかもしれません"とはどういう意味ですか? Task.Factory.StartNewを使用してLoadMyObjectを呼び出すためのバックグラウンドタスクを作成するとき、何も変更されませんでした...私もBeginInvokeを試しましたが、TabItemは空のままです。 – rad

+0

私は 'LoadMyObject'が実際に何をしているのか分からないので、長時間実行していたメソッドであると仮定して、新しいデータをレンダリングするためにWPFに表示を更新させるイベントを発生させました。私はあなたがバックグラウンドスレッドで長時間実行されている部分を実行するためにこれをリファクタリングできると思っていましたし、必要なときだけUIに呼び出します。今すぐタスクを開始しても何も変更されません。なぜなら、すぐにUIスレッドに戻る「Invoke」をすぐに呼び出すからです。 – davisoa

関連する問題