如何使用ContinueWith正确管理任务中的异常

Iva*_*ART 8 c# multithreading exception task faulted

在阅读有关任务和exepcion管理的信息后,我使用此代码来管理任务中抛出的异常:

Task<Object> myTask = Task.Factory.StartNew<Object>(doTask, CancellationToken.None,   TaskCreationOptions.None, TaskScheduler.Default);
myTask .ContinueWith(task => afterTask(task), TaskScheduler.FromCurrentSynchronizationContext());
Run Code Online (Sandbox Code Playgroud)

doTask和AfterTask在哪里:

private <Object> doTask() {
    throw new Exception("BOOM");
}

private afterTask(Task<Object> aTask) {

        if (aTask.IsFaulted)
        {
            MessageBox.Show(aTask.Exception.InnerException.Message);
        }
        else //whatever
}
Run Code Online (Sandbox Code Playgroud)

抛出Exception Boom时,Visual Studio会显示一条警告,通知未捕获异常但如果我继续执行异常则在afterTask函数中处理.

这段代码是正确的还是我错过了解任务的一些基本行为?有什么办法可以避免调试器发出没有捕获到execption的警告?有点烦人......

提前致谢

dca*_*tro 21

试试这个:

 task.ContinueWith(
            t =>
            t.Exception.Handle(ex =>
                                   {
                                       logger.Error(ex.Message, ex);
                                       return false;
                                   })

            , TaskContinuationOptions.OnlyOnFaulted
            );
Run Code Online (Sandbox Code Playgroud)

通过使用TaskContinuationOptions.OnlyOnFaulted,ContinueWith只有在原始任务抛出异常时才运行块.

另外,您可以选择是否从传递给的lambda返回true或false Handle,指示是否已处理异常.就我而言,我不想阻止异常传播.您可能希望将其更改为true在您的情况下返回.