为了帮助提高客户端的性能,我将处理请求卸载到任务上。这样做是因为处理通常需要一些时间,而且我不希望客户端等待一段时间才能获得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回收或网站停止时这些任务会发生什么。
答案 0 :(得分:4)
当IIS回收时,它等待所有线程完成并退出 - 直到池上的超时值。在那段时间之后,他们杀死所有正在运行的线程并重新开始。
因此,当应用程序请求使用globa.asax
函数在Application_End
处关闭时,您可以设置线程的信号停止。
答案 1 :(得分:3)
IIS回收时运行任务会发生什么?
当IIS回收时,它只会相应地关闭您的运行任务。如果您的任务需要一些时间,您应该考虑在单独的流程上运行您的任务。纠正方法是使用Queue(MSMQ,RabbitMQ ...)来存储您的任务,并使用另一个进程从队列中挑选您的任务来运行。您可以将Windows服务或控制台主机与调度程序一起使用。
来自Phil Haack的当ASP.NET取消AppDomain时,它将尝试刷新现有请求,并在它关闭App Domain之前给予时间完成。 ASP.NET和IIS考虑到他们知道正在运行的代码,例如作为请求的一部分运行的代码。
问题是,ASP.NET不知道在使用计时器或类似机制生成的后台线程上完成的工作。它只知道与请求相关的工作。