2016-04-22 19 views
2

私は、バックグラウンドでタスクを実行する拡張メソッドを持っています。それをスローする例外を処理するために、try-catchブロックに配置します。問題は、ビジュアルスタジオが常にコードの再登場部分で停止し、なぜその理由がわからないということです。リトロー例外がキャッチされない

try { 
    task.RunInBackground(); 
} catch (Exception e) { 
    // do something 
} 

enter image description here

+0

あなたのタスクを待っているわけではありません.RunInBackgroundステートメント、try catchは無効です – Evk

+0

これはスローされたものです – jamiedanq

+0

あなたはそれがキャッチされていないと言っていますが、私はあなたのコードのどの部分もそれを捕まえると思うかもしれない理由は何もありません。あなたは精緻化できますか? – hvd

答えて

2

次のようなタスク待機する必要があります。

try { 
    await task.RunInBackground(); 
} catch (Exception e) { 
    // do something 
} 

は、非同期のボイドを使用して可能な限り避けてくださいを。 async Task以下のように置き換えることにより、async voidを削除します。

public static async Task RunInBackground(this Task task) { 
    // .... 
} 

あなたは、MSDNから非同期のボイドチェックこのlinkを避けるために、理由を知る必要がある場合。

+0

私はちょうど火をつけて仕事を忘れたかったので、私は非同期voidを使ったのです。私がそれを待っていれば、私は待っているコール以外の何も実行しません。私の仕事は無限のwhileループで実行されます。 – Andrew

+0

私はdforgetを起動する必要があります。次にタスクに例外をスローしましたか?例外を無視してください(これは良い考えではありません) – CodeNotFound

0

次の操作を行うことができます

SynchronizationContext.SetSynchronizationContext(new SynchronizationContext()); 
task.RunInBackground().ContinueWith(t => 
{ 
    throw t.Exception; 
}, 
    CancellationToken.None, 
    TaskContinuationOptions.OnlyOnFaulted, 
    TaskScheduler.FromCurrentSynchronizationContext() 
).ConfigureAwait(false); 

例外は、そのタスクによってスローされるまで、このコードは、タスクのために停止しません。

関連する問題