2012-03-31 4 views
7

私のWPFアプリケーションでは、コンストラクタにDispatcher.BeginInvokeを使用してコンテンツをロードしています。私の質問は、UIスレッドをブロックすることですか?Dispatcher.BeginInvokeとTask.Factory.StartNewの違いは何ですか

Task.Factory.StartNewを使用してUIに戻ってアプリケーションをロードすると、コンテンツのロード処理時間に関係なくアプリケーションが最初に読み込まれるほうがよいでしょうか?

これはどちらが良いアプローチですか?なぜですか?

答えて

20

彼らは2つの非常に異なるものの操作を行います。

  • Task.Factory.StartNewスケジュール スレッドプールのスレッド上で実行するためのデリゲートを。現在のスレッドは、このタスク(非同期)の結果を待たずに実行を続けます。通常は、実行中のバックグラウンドタスクを生成して、UIが長時間ブロックされないようにします(「フリーズ」ではなく)。

  • Dispatcher.BeginInvoke ディスパッチャ(UI)スレッドで実行する委任者をスケジュールします。通常、これは、一部のUIの コントロールを、バックグラウンドスレッド で実行された操作の結果で更新するために行われます。基本的にここでUIを更新しています。

は直接あなたの質問に答えるために:あなたはディスパッチャスレッドで長時間の操作をスケジュールべきではありません

、通常、あなたはここでしかUIコントロールを更新したいです。デリゲート内のコードはUIスレッド上で実行され、実行時にブロックされます。現在のコード(コンストラクタからスケジュールを設定)にThread.Sleep(10000)を入れるだけで、UIがフリーズします。バックグラウンドタスクは、Taskまたはバックグラウンドワーカー(どちらもスレッドプールスレッドを使用します)を使用してください。

それともTask.Factory.StartNewを使用することをお勧めしますし、そのアプリケーションが最初にかかわらず のコンテンツの読み込み処理時間をロードするようUIに戻って 物事を派遣。

はい!

+0

返信いただきありがとうございます。Dispatcher.BeginInvokeは私のアプリでUIをブロックします。私はロード中にいくつかのサービスを呼び出す必要があり、サービスが停止している場合、私はDispatcher.BeginInvokeを使用していますが、UIをハングするので、私の基本的な質問はディスパッチャーまたはタスクをこのケースで使用することです。 –

+2

*バックグラウンドで何かを実行したい場合*タスクを使用する場合は、結果をUIに送信するには 'Dispatcher.BeginInvoke'を使います – BrokenGlass

関連する問題