C# 理解Task.Run()中的异常

C# 理解Task.Run()中的异常,c#,task,C#,Task,此代码: class Program { static void Main(string[] args) { Task.Run(() => { throw new Exception(); }).Wait(); } } 这让我很困惑。运行它,调试器就会像我预期的那样在抛出时中断。按f5键,调试器在任务上运行。如我所料,使用聚合异常运行 再次点击f5,调试器在抛出时再次中断,然后在运行时重复 这

此代码:

class Program
{
    static void Main(string[] args)
    {
        Task.Run(() =>
        {
            throw new Exception();
        }).Wait();
    }
}
这让我很困惑。运行它,调试器就会像我预期的那样在抛出
时中断。按f5键,调试器在
任务上运行。如我所料,使用
聚合异常运行

再次点击f5,调试器在抛出时再次中断,然后在运行时重复


这是怎么回事?我希望两次休息,然后程序退出。要么我的调试器一团糟/我还没有喝足够的咖啡,要么它看起来像是
任务。Run
正在重试委托…

在不使用任务时,您可以看到完全相同的行为:

class Program
{
    static void Main(string[] args)
    {
        throw new Exception();
    }
}

由于存在未处理的异常,调试器将不会继续(因为进程将崩溃)。

点击F5并再次启动程序?只是猜测…
Wait
是同步的,也就是说它会阻塞直到任务完成。@StefanSteinegger程序不会重新启动。将断点添加到
抛出
,代码将被重复执行run@AmitKumarGhosh是的,我知道。不知道这有什么帮助…使用
Wait(int-ms)
重载。它将在该毫秒后停止。您可以通过在中取消选中“工具->选项->调试->常规”中的“在未处理的异常上展开调用堆栈”来停止此行为VS@Fratyx所以这是一个VisualStudio/调试器的怪癖,而不是不调试时会发生什么?@AndrewBullock:的确如此。要禁用该行为,请使用Fratyx提到的设置。(调试后的进程将在出现异常时退出)@timeeckhut它还将向桌面抛出一个丑陋的.net程序崩溃错误消息框。不捕获程序内部的异常是非常糟糕的做法。