Próbuję przechwycić wyjątek generowany z metody zadania przy użyciu ContinueWith i OnlyOnFaulted jak poniżej. Jednak otrzymuję nieobsługiwany wyjątek podczas próby uruchomienia tego kodu.Kontynuuj z TaskContinuationOptions.OnlyOnFaulted nie wydaje się wychwycić wyjątku zgłoszonego z uruchomionego zadania
Chciałbym, aby zadanie zostało ukończone, ponieważ już mam do czynienia z wyjątkiem. Ale Task.Wait() uruchamia się do AggregateException.
var taskAction = new Action(() =>
{
Thread.Sleep(1000);
Console.WriteLine("Task Waited for a sec");
throw (new Exception("throwing for example"));
});
Task t = Task.Factory.StartNew(taskAction);
t.ContinueWith(x => Console.WriteLine("In the on Faulted continue with code. Catched exception from the task."+ t.Exception), TaskContinuationOptions.OnlyOnFaulted);
Console.WriteLine("Main thread waiting for 4 sec");
Thread.Sleep(4000);
Console.WriteLine("Wait of 4 secs complete..checking if task is completed?");
Console.WriteLine("Task State: " + t.Status);
t.Wait();
Jeśli poradzę sobie z wyjątkiem w metodzie zadania, jak poniżej, wszystko pójdzie normalnie, jak oczekuję. Zadanie zostanie uruchomione, wyjątek zostanie zapisany, a oczekiwanie również się powiedzie.
var taskAction = new Action(() =>
{
try
{
Thread.Sleep(1000);
Console.WriteLine("Task Waited for a sec");
throw (new Exception("throwing for example"));
}
catch (Exception ex)
{
Console.WriteLine("Catching the exception in the Action catch block only");
}
});
Task t = Task.Factory.StartNew(taskAction);
t.ContinueWith(x=> Console.WriteLine("In the on Faulted continue with code. Catched exception from the task."+ t.Exception), TaskContinuationOptions.OnlyOnFaulted);
Console.WriteLine("Main thread waiting for 4 sec");
Thread.Sleep(4000);
Console.WriteLine("Wait of 4 secs complete..checking if task is completed?");
Console.WriteLine("Task State: " + t.Status);
t.Wait();
Moje pytanie brzmi: Czy jestem używając OnlyOnFaulted
prawidłowo, czy jest to zawsze lepiej obsłużyć wyjątek w metodzie zadaniowej samego? Chciałbym, aby główny wątek był kontynuowany, nawet jeśli zadanie działa w wyjątek. Ponadto chcę zalogować ten wyjątek z metody zadania.
Uwaga: Muszę zaczekać na zakończenie metody zadania przed przejściem dalej (z błędami lub bez).
Podsumowując (moje rozumienie tej pory)
Jeśli wyjątek od zadaniem jest obsługiwane to znaczy jeśli czekać albo czekają łapie wyjątek to wyjątek będzie propagowane do continuedtask onfaulted. Wyjątek może zostać przechwycony nawet w metodzie zadania i jest używany \ obsadzony.
try
{
t.wait();
}
catch(Exception e)
{
LogError(e);
}
W powyższym przypadku, zanim LogError zostanie wywołany, wykonywane jest dalsze zadanie związane z uszkodzeniem głównego zadania.
Która wersja .NET używasz? –
@YuvalItzchakov przy użyciu .NET 4.5. – seesharpconcepts