Mam pytanie odnośnie poniższego kodu. Dlaczego, gdy do ostatniej kontynuacji zostaje przekazane zadanie z innym statusem niż ustalony to zostaje zgłoszony wyjątek "Zadanie zostało anulowane", dlaczego po prostu ta kontynuacja nie zostanie pominięta tak jak w przypadku nie korzystania z await. Ktoś wie coś na ten temat? Byłoby to za trudne w implementacji, żeby uwzględniać wszystkie warunki, więc jeżeli Status jest inny to od razu zgłasza wyjątek i po problemie?
private async void TaskTest()
{
await Task.Run(() =>
{
Console.WriteLine("Zadanie uruchomione");
System.Threading.Thread.Sleep(1000);
})
.ContinueWith((t) =>
{
Console.WriteLine(t.Status);
})
.ContinueWith((t) =>
{
Console.WriteLine("Zadanie zakończone niepowodzeniem");
}, TaskContinuationOptions.OnlyOnFaulted);
Console.WriteLine("TaskTest zakończony");
}
//Output
Zadanie uruchomione
RanToCompletion
Exception thrown: 'System.Threading.Tasks.TaskCanceledException' in mscorlib.dll
Jeżeli Status się zgadza czyli dla poniższego kodu wszystko jest ok, kod z kontynuacji się wykonuje, bo poprzednie zadanie ma Status Faulted
private async void TaskTest()
{
await Task.Run(() =>
{
Console.WriteLine("Zadanie uruchomione");
System.Threading.Thread.Sleep(3000);
})
.ContinueWith((t) =>
{
Console.WriteLine(t.Status);
throw new Exception();
})
.ContinueWith((t) =>
{
Console.WriteLine("Zadanie zakończone niepowodzeniem");
}, TaskContinuationOptions.OnlyOnFaulted);
Console.WriteLine("TaskTest zakończony");
}
//Output
Zadanie uruchomione
RanToCompletion
Exception thrown: 'System.Exception' in WindowsFormsApp.exe
Zadanie zakończone niepowodzeniem
TaskTest zakończony