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程序崩溃错误消息框。不捕获程序内部的异常是非常糟糕的做法。