私の問題を説明するためのいくつかの擬似コード:
public async Task DoSomethingAsync()
{
try
{
var task1 = DoThisAsync(); // throws exception
var task2 = DoThatAsync();
await task1.Then(t => Handle(t));
await task2.Then(t => Handle(t));
}
catch (AggregateException)
{
Console.WriteLine("Whatnow?");
}
}
そして、次のように定義されます。
// from https://gist.github.com/rizal-almashoor/2818038
public static Task Then(this Task task, Action<Task> next)
{
var tcs = new TaskCompletionSource<AsyncVoid>();
task.ContinueWith(t=>
{
if (t.IsFaulted)
tcs.TrySetException(t.Exception); // continuing task1 this line only gets hit
// after DoThatAsync() is completed??
else
{
try
{
next(t);
tcs.TrySetResult(default(AsyncVoid));
}
catch (Exception ex)
{
tcs.TrySetException(ex);
}
}
});
return tcs.Task;
}
したがって、私の問題は、何らかの理由で、DoThisAsync()がかなり早い段階で例外をスローしたとしても、DoThatAsync()が終了するまで「whatnow」が表示されないことです。これは正確なコードではありません。時間を無駄にしないように単純化しようとしました。この動作を説明するものがここにない場合は、私に知らせてください。詳細を追加します。
編集
この質問の目的のために、DoThisAsync()とDoThatAsync()は、基本的に次のことを行う非同期メソッドであると想像できます。
DoThisAsync:
Thread.Sleep(30000); // wait a short perioud of time
throw new Exception(); // and throw an exception
DoThatAsnyc:
Thread.Sleep(240000); // wait a long period of time