为什么异常会导致应用程序池崩溃?

3

我有一个 Web API 应用程序,其中包含此方法

public class TestController
{
     public UserView Get()
     {
            var testThread = new Thread(() => { throw new Exception(); });
            testThread.Start();
            Thread.Join();
            Thread.Sleep(1000);
            return null;
     }
}

当我请求这个方法时,我的应用程序池会崩溃。我会收到这个窗口 enter image description here 并且应用程序池会崩溃。 enter image description here 当我有这个方法时
        var task = new Task(() => { throw new Exception(); });
        task.Start();

一切都很好。为什么?

2个回答

2
这就是 ASP.NET 的工作方式。如果一个线程有一个未处理的异常,而这个异常与请求没有关联,那么它将导致应用程序崩溃。这在Phil Haack的博客中有描述。他提到了一个详细的后续帖子,解释为什么会这样,但我找不到这个后续帖子。
根据您在另一个线程中需要做什么,您可以使用其他替代方法,例如异步代码、QueueBackgroundWorkItem或专门设计以解决这些限制的scheduler,如Hangfire、WebBackgrounder或Quartz.NET。

2

我猜是因为Task不会抛出异常,所以它将其作为Task对象的属性返回。如果您不检查Task的结果,它甚至不会被抛出,直到应用程序启动关闭序列,然后它将被作为UnhandledException抛出。我猜在Thread中是不同的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接