IIS回收时运行任务会发生什么

时间:2013-01-25 17:16:54

标签: c# asp.net c#-4.0 iis iis-7.5

为了帮助提高客户端的性能,我将处理请求卸载到任务上。这样做是因为处理通常需要一些时间,而且我不希望客户端等待一段时间才能获得200响应。将工作卸载到任务上的Web服务始终处理帖子。

public void ProcessRequest(HttpContext context)
{
    // check for bad requests -- return 400

    // get copy of the context input stream

    Task.Factory.StartNew(() =>
    {
        ProcessRequest(contextInputStreamCopy);
    });
}

private void ProcessRequest(Stream inputStream)
{
    try
    {
        // process input stream
    }
    catch(Exception ex)
    {
        // any server error that would normally result in 500 response are not
        // exposed to the clients, the clients are to see 200 when the server 
        // encounters an error
    }
}

所以我的问题是当IIS回收或网站停止时这些任务会发生什么。

2 个答案:

答案 0 :(得分:4)

当IIS回收时,它等待所有线程完成并退出 - 直到池上的超时值。在那段时间之后,他们杀死所有正在运行的线程并重新开始。

因此,当应用程序请求使用globa.asax函数在Application_End处关闭时,您可以设置线程的信号停止。

答案 1 :(得分:3)

  

IIS回收时运行任务会发生什么?

当IIS回收时,它只会相应地关闭您的运行任务。如果您的任务需要一些时间,您应该考虑在单独的流程上运行您的任务。纠正方法是使用Queue(MSMQ,RabbitMQ ...)来存储您的任务,并使用另一个进程从队列中挑选您的任务来运行。您可以将Windows服务或控制台主机与调度程序一起使用。

来自Phil Haack的

More information

  

当ASP.NET取消AppDomain时,它将尝试刷新现有请求,并在它关闭App Domain之前给予时间完成。 ASP.NET和IIS考虑到他们知道正在运行的代码,例如作为请求的一部分运行的代码。

     

问题是,ASP.NET不知道在使用计时器或类似机制生成的后台线程上完成的工作。它只知道与请求相关的工作。