【问题标题】:Why exception break application pools?为什么异常中断应用程序池?
【发布时间】:2015-09-09 14:18:59
【问题描述】:

我有使用这种方法的 web api 应用程序

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

当我请求此方法时,我的应用程序池会中断。我收到了这个窗口

并破坏了一个应用程序池。 当我有这个方法时

        var task = new Task(() => { throw new Exception(); });
        task.Start();

一切都很好。为什么?

【问题讨论】:

    标签: c# asp.net multithreading iis asp.net-web-api


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      这就是 ASP.NET 的工作原理。如果一个线程有一个未处理的与请求无关的异常,那么它将关闭应用程序。这在Phil Haack's blog 上进行了描述。他提到了一个详细的后续帖子,具体解释了为什么会下降,但我找不到后续帖子。

      根据您需要在另一个线程中执行的操作,您可以使用异步代码、QueueBackgroundWorkItem 或专门设计用于解决这些限制的 scheduler 等替代方法,例如 Hangfire、WebBackgrounder 或 Quartz .NET。

      【讨论】:

        猜你喜欢
        • 2012-08-30
        • 2015-06-11
        • 2011-04-24
        • 1970-01-01
        • 2010-10-02
        • 2011-04-21
        • 2018-08-07
        • 2020-06-15
        • 1970-01-01
        相关资源
        最近更新 更多