2012-01-03 5 views
11

StartボタンとStopボタン、Startを押した後にバックグラウンドで実行されるスレッドがあるアプリケーションがあります。私はMVCとTPLを使っています。Wait()を使わないTPLでの例外処理

私はWait()メソッドを呼び出すことはないので、どのようにTPLで例外を処理できますか?例外的に私はエラーメッセージボックスを表示する必要があり、このボックスはすぐにスローされた後に表示されるはずです。

私は常にバックグラウンドで1つのスレッドを持っていますので、前にスレッドを停止せずにStartを押すことはできません。

私は良いパターンやベストプラクティスを探しています。私は、スレッド内のtry..catch置き、それぞれのキャッチでイベントを呼び出すためにアイデアを持っているが、私はわからないようなアプローチはWait方法は、単にExceptionをとり、高レベルでは良いアーキテクチャの決定

答えて

24

あなたがTasksを使用している場合は、あなたがいる場合にのみ実行される継続を追加することができます例外がスローされます。また、あなたのUIのスレッドで実行するように指示することもできます。

task.ContinueWith(
    t => { var x = t.Exception; ...handle exception... }, 
    CancellationToken.None, 
    TaskContinuationOptions.OnlyOnFaulted, 
    TaskScheduler.FromCurrentSynchronizationContext() 
); 
+0

これは本当に素晴らしい機能です!ありがとうございます。 – Archeg

+0

@Archegよろしくお願いします。 –

3

でありますバックグラウンドスレッドで発生し、別のExceptionタイプにラップして再スローします。したがって、論理コードを囲む標準のtry/catchブロックを持つバックグラウンドスレッドの元のExceptionを見ることができます。

2

タスク(バックグラウンドスレッド上)で例外を処理するのに問題はありません。あなたは、例外が発生した場合にUIを表示する必要がある場合、あなたは(あなたは、WPFやSilverlightを使用していると仮定)ディスパッチャを使用することができます。http://msdn.microsoft.com/en-us/magazine/cc163328.aspx