WPF

2012-01-19 10 views
4

でブロックするメッセージボックスを表示するには、.NET 4タスク・ライブラリーを使用して、私持っている私のWPFアプリケーションに次のコード:それが正常に継続をトリガし、例外が発生した場合にメッセージボックスを表示WPF

Task task = Task.Factory.StartNew(() => { 
     DoInitialProcess(); 
    }); 

task.ContinueWith(t => 
    Dispatcher.BeginInvoke((Action)(() => { 
     MessageBox.Show("Error: " + t.Exception.InnerExceptions[0].Message); 
    })), TaskContinuationOptions.OnlyOnFaulted); 

、メインUIスレッドの入力をブロックしません。

メインのUIスレッドをブロックしないのはなぜですか?そうするための最良の方法は何ですか?

答えて

5

一般的には、これは適切なTaskSchedulerを経由し、Dispatcher.BeginInvokeではなく経由します。以下を試してください。

このタスクをUIスレッドで作成している場合は、上記の操作が期待通りに機能するはずです。

ただし、このタスクをバックグラウンドスレッドで開始する場合は、適切なTaskSchedulerを継続するためのきれいな方法を提供する必要があります。これは、ウィンドウの構成中にスケジューラをつかんだり、他の手段でスケジューラをつかんだり、後でそれを使うことによって行うことができます。

+0

ありがとうございました。どういうわけか、私はUIとは別のスレッド上にあったことが分かりました。あなたが提案するように、ウィンドウの作成時にUI TaskSchedulerを取得する必要がありました。一度それをしたら、あなたのコードは完璧に動作しました。再度、感謝します。 – Sako73