彼らは2つの非常に異なるものの操作を行います。
Task.Factory.StartNew
スケジュール スレッドプールのスレッド上で実行するためのデリゲートを。現在のスレッドは、このタスク(非同期)の結果を待たずに実行を続けます。通常は、実行中のバックグラウンドタスクを生成して、UIが長時間ブロックされないようにします(「フリーズ」ではなく)。
Dispatcher.BeginInvoke
ディスパッチャ(UI)スレッドで実行する委任者をスケジュールします。通常、これは、一部のUIの コントロールを、バックグラウンドスレッド で実行された操作の結果で更新するために行われます。基本的にここでUIを更新しています。
は直接あなたの質問に答えるために:あなたはディスパッチャスレッドで長時間の操作をスケジュールべきではありません
、通常、あなたはここでしかUIコントロールを更新したいです。デリゲート内のコードはUIスレッド上で実行され、実行時にブロックされます。現在のコード(コンストラクタからスケジュールを設定)にThread.Sleep(10000)
を入れるだけで、UIがフリーズします。バックグラウンドタスクは、Task
またはバックグラウンドワーカー(どちらもスレッドプールスレッドを使用します)を使用してください。
それともTask.Factory.StartNewを使用することをお勧めしますし、そのアプリケーションが最初にかかわらず のコンテンツの読み込み処理時間をロードするようUIに戻って 物事を派遣。
はい!
返信いただきありがとうございます。Dispatcher.BeginInvokeは私のアプリでUIをブロックします。私はロード中にいくつかのサービスを呼び出す必要があり、サービスが停止している場合、私はDispatcher.BeginInvokeを使用していますが、UIをハングするので、私の基本的な質問はディスパッチャーまたはタスクをこのケースで使用することです。 –
*バックグラウンドで何かを実行したい場合*タスクを使用する場合は、結果をUIに送信するには 'Dispatcher.BeginInvoke'を使います – BrokenGlass