8

在阅读了有关任务和执行管理的信息后,我正在使用此代码来管理任务中引发的异常:

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

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
}

当抛出异常繁荣时,Visual Studio 会显示一条警报,通知尚未捕获到异常,但如果我继续执行,则在 afterTask 函数中处理异常。

这段代码是正确的还是我误解了任务的一些基本行为?有什么方法可以避免调试器发出未捕获到执行的警报?是不是有点烦...

提前致谢

4

2 回答 2

21

试试这个:

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

            , TaskContinuationOptions.OnlyOnFaulted
            );

通过使用,仅当原始任务引发异常时才TaskContinuationOptions.OnlyOnFaulted运行块。ContinueWith

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

于 2013-09-17T09:52:06.197 回答
-3
        try
        {
            var t1 = Task.Delay(1000);

            var t2 = t1.ContinueWith(t =>
            {
                Console.WriteLine("task 2");
                throw new Exception("task 2 error");
            }, TaskContinuationOptions.OnlyOnRanToCompletion);

            var t3 = t2.ContinueWith(_ =>
            {
                Console.WriteLine("task 3");
                return Task.Delay(1000);
            }, TaskContinuationOptions.OnlyOnRanToCompletion).Unwrap();

            // The key is to await for ALL tasks rather than just
            // the first or last task.
            await Task.WhenAll(t1, t2, t3);
        }
        catch (AggregateException aex)
        {
            aex.Flatten().Handle(ex =>
                {
                    // handle your exceptions here
                    Console.WriteLine(ex.Message);
                    return true;
                });
        }
于 2014-12-18T02:23:04.130 回答