c#でTaskに対してContinueWithを使った同期処理を行っています。重い処理の戻り値を取得しつつ、例外が発生した時にExceptionオブジェクトを取得する方法を教えてください。
現状のコードは以下の通りです。
cs
1void Main(){ 2 var taskScheduler = TaskScheduler.FromCurrentSynchronizationContext(); //UIスレッド 3 Taskの処理("xxxx").ContinueWith(t => { 4 // 成功時にここにくる。例外が発生した時はこない。t.Result にアクセスしたい 5 }, CancellationToken.None, TaskContinuationOptions.NotOnFaulted, taskScheduler).ContinueWith(t => { 6 // 例外が発生した時はここにくる。成功時はこない。t.Exception にアクセスしたい 7 }, CancellationToken.None, TaskContinuationOptions.NotOnRanToCompletion, taskScheduler); 8} 9Task<String> Taskの処理(String arg) { 10 return Task<String>.Run(() => { 11 // ここで同期の重い処理が行われる。 12 //throw new Exception("NG"); // この処理の中で例外が発生する可能性がある 13 return "OK"; 14 }); 15} 16
この書き方ですと、throw new Exceptionのコメントアウトを外して「例外が発生した時はここにくる」でt.Exceptionの値にアクセスする事が出来ません。
また、「例外が発生した時はここにくる」の時の引数のtのStatusがCanceledになっているのですが、ここはFaultedになるべきだと思います。
2つあるContinueWithの引数のTaskContinuationOptions の指定がおかしいのかなと思うのですが、どの様に指定すればよいでしょうか。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/31 11:11
2019/03/31 11:15 編集
2019/03/31 11:19
2019/03/31 11:24
2019/03/31 11:28
2019/03/31 11:32
2019/03/31 11:34