我正在尝试使用ContinueWith和OnlyOnFaulted捕捉从任务方法抛出的异常,如下所示。然而,在我尝试运行此代码时,我遇到了未处理的异常。
由于我已经处理了异常,因此我希望任务能够完成运行。但是Task.Wait()会遇到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();
如果我像下面这样在任务方法中处理异常,一切都会按照我的预期正常进行。任务完成,异常被记录下来,等待也成功了。
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();
我的问题是:我是否正确使用了
OnlyOnFaulted
,或者总是更好地在任务方法本身处理异常?即使任务遇到异常,我也希望主线程继续运行。此外,我还想从任务方法记录该异常。注意:在继续进行(无论有无错误)之前,我必须等待任务方法完成。
总结一下(我目前的理解):
如果处理了来自Task的异常,即如果wait或await捕获了异常,则异常将传播到continuedtask onfaulted。 甚至可以在任务方法中捕获和消耗\处理异常。
try
{
t.wait();
}
catch(Exception e)
{
LogError(e);
}
在上述情况中,在调用LogError之前,将执行与主任务的onfaulted相关联的继续任务。