2016-04-22 15 views
3

例特定のシナリオでは今Dispatcher.Invoke - 私のUIの凍結/ブロックを行い

Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, (Action)OffLoadWork); 

のために、このOffLoadWorkをする必要があります、あなたはApplicationIdleにBeginInvokeメソッドとして登録され、いくつかのルーチンを持っている想像してみて私は

Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.ApplicationIdle, (Func<object>)(() => 
{ 
    //do nothing just wait for the OffLoadWork to happen... 
    return null; 
})); 

を呼び出すためにか、それは私のUIがフリーズを発生することができため、私はそうUI操作の途中で午前以来、UIでの操作を行うときに実行、ボタンのクリックで、たとえば、それは安全です実際にアイドルになるのはいつですか?

私の最初のテストでは動作していたようですが、フリーズ/ブロックする方法がないことを確認したいだけです。

答えて

1

私はあなたが混乱していると思います。DispatcherPriority.ApplicationIdle Invokeは同期で、UIをブロックできます。

DispatcherPriorityこの定義では、優先度はDispatcherイベントキューの他の保留中操作と比較して、指定されたメソッドが呼び出されます。したがって、操作がDispatcherキュー内で唯一起こってUIスレッドでトリガーされた場合、それは戻ってこないまでブロックします。

+0

私はInvokeメソッドが同期であり、本質的にブロックがあることを知っています。なぜなら、私はUI操作中ですからApplicationIdleの状態が決して上がらないかもしれないので、私は現在UIでコードを実行していますか? –

+0

これは実際にApplicationIdleではなく、単にrelatavityを示しています。したがって、Dispatcherキューに優先順位の高い他の操作がある場合は、それらが最初に呼び出され、操作が完了するとこの操作が選択されます。 – Nitin

+0

この権利を得るために、Priority ApplicationIdleは実際にアプリケーションがその時点でアイドル状態(何もしていない状態)であることを意味するものではなく、そのキーの下のキュー内のすべてを実行し、 ? –

関連する問題