タスク並列ライブラリの ContinueWith が何をしているように見えるのか、少し混乱しています。
私の理解では、タスクが完了するまでこれを呼び出すべきではありません。while true ループにいる場合、これはまったく呼び出されるべきではありません。
DateTime t = DateTime.Now.AddSeconds(10);
Task.Factory.StartNew(async () =>
{
while (true)
{
if (t < DateTime.Now) //after 10s throw
{
throw new Exception(); //I expect it to run the continuation here
}
Console.WriteLine("looped");
await Task.Delay(new TimeSpan(0, 0, 1));
}
}
).ContinueWith(ct => Console.WriteLine("Continued with: {0}",ct.Result.Status)) ;
次のコードは、例外がスローされるまで ContinueWith メソッドを実行しないと予想されますが、そうではありません。代わりに、次の出力が得られます。
looped
Continued with: WaitingForActivation
looped
looped
looped
looped
looped
looped
looped
looped
looped
最初の遅延に達したときに、ContinueWith が呼び出されるのはなぜですか?