Task.Wait()未捕获AggregateException

时间:2017-04-20 23:02:22

标签: c# task wait aggregateexception

我正在尝试捕获一个NullReferenceException,它将由Task.Factory.StartNew方法抛出。我认为它应该通过task.Wait()方法的'try'语句来捕获。 我也提到Why is this exception not caught?,但不知道。你会分享你的智慧吗?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading;
using System.Threading.Tasks;

namespace Csharp_study
{
    class Program
    {
        static void Main(string[] args)
        {
            Task my_task = Task.Factory.StartNew(() => { throw null; });
            try
            {
                my_task.Wait();
            }

            catch (AggregateException exc)
            {
                exc.Handle((x) =>
                    {
                        Console.WriteLine(exc.InnerException.Message);
                        return true;
                    });
            }

            Console.ReadLine();
        }
    }
}

2 个答案:

答案 0 :(得分:2)

此行为是由VS的调试器而不是您的代码造成的。

如果您处于调试模式且启用了仅我的代码(这是大多数语言的默认设置),关闭它应该可以解决问题。

要停用“我的代码”功能,请转到“工具”>选项>调试>常规并取消选中“仅我的代码”复选框。

如果您想知道启用“我的代码”功能的功能,请参阅msdn的摘录。

  

启用我的代码   启用此功能时,调试器   仅显示和步入用户代码(“我的代码”),忽略系统   代码和其他优化或没有调试的代码   符号。

答案 1 :(得分:1)

如果要处理任务的异常,请检查它是否有故障。如果没有故障继续执行。

   static void Main(string[] args)
        {
            Task my_task = Task.Factory.StartNew(() => { throw null; });

            my_task.ContinueWith(x =>
            {

                if (my_task.IsFaulted)
                {
                    Console.WriteLine(my_task.Exception.Message);

                }
                else {
                    //Continue with Execution
                }
            });
        }

在这种情况下,return true;无效,因为方法没有返回类型。