上記のトピックについて多くの質問がありますが、これは新しい質問を保証するのに十分に異なると私は考えています。私は次のようなものを持っています。Status
; TaskStatus.RanToCompletion
,TaskStatus.Canceled
およびもちろんAggregateException
からTaskStatus.Faulted
を介して。何それから - コードがTPLと例外処理
Task<bool> asyncTask = Task.Factory.StartNew<bool>(() =>
asyncMethod(uiScheduler, token, someBoolean), token);
asyncTask.ContinueWith(task =>
{
// Check task status.
switch (task.Status)
{
// Handle any exceptions to prevent UnobservedTaskException.
case TaskStatus.RanToCompletion:
if (asyncTask.Result)
{
// Do stuff...
}
break;
case TaskStatus.Faulted:
if (task.Exception != null)
mainForm.progressRightLabelText = task.Exception.InnerException.Message;
else
mainForm.progressRightLabelText = "Operation failed!";
default:
break;
}
}
このように見えるすべてがうまく動作しますが、継続の中から投げ出されるAggregateException
の可能性があるように私は、私はこの権利をやっているかどうか心配ですか?
私はWait
に私のasyncTask
を置いておきたいと思いません。これはUIスレッドへの復帰を妨げるでしょう。続き内からスローされた例外は、私がこのような何かをしなければならないというわけではありませできキャッチするために確実に
Task parentTask = Task.Factory.startNew(() =>
{
Task<bool> asyncTask = Task.Factory.StartNew<bool>(() =>
asyncMethod(uiScheduler, token, someBoolean), token);
Task continueTask = asyncTask.ContinueWith(task =>
{
// My continuation stuff...
}
try
{
continueTask.Wait();
}
catch(AggregateException aggEx)
{
// Some handling here...
}
});
これでも動作しますか?ここでベストプラクティスは何ですか?
いつもありがとうございました。
私は実際に彼らはAggregateExceptionを投げたとき「完成に走った」という作業を見てきました。この種のエラー処理は機能しません。どうしてトライ/キャッチを使ってみませんか? –
バックグラウンドスレッドまたは実際の継続デリゲートメソッドで呼び出されたメソッドを意味しますか? – MoonKnight