所以我在MVC控制器方法里面有以下代码:
public ActionResult ProcessFile ()
{
ThreadStart threadStart = new ThreadStart ( ()=>{
// Doing some long processing that takes 20 minute
} );
Thread thread = new Thread(threadStart);
thread.Start();
}
这里的问题是当多个请求发送到此控制器方法时,该线程被杀死。 我需要Thread继续工作,直到处理结束,似乎资源占用了大量资源,线程可以继续工作。 如果我从Windows应用程序或服务运行该过程它完美地工作,它只是从Web应用程序启动时遇到问题。
答案 0 :(得分:6)
理想情况下,您不应在IIS 7中的Web请求中创建线程(对于长时间运行的后台作业)。
如果应用程序池/ AppDomain重新启动,线程将停止,这可能由于多种原因而发生,例如更改bin文件夹的内容,更改为web.config,一段时间不活动,资源阈值为到达(例如内存使用)。事实上,默认情况下,AppDomain会定期重新启动,除此之外没有任何其他原因。
因此,应使用作业队列和后台作业运行器来实现长时间运行的任务,例如:控制台应用程序或Windows服务(重要的是,不在IIS的上下文中运行),处理这些作业。
Web请求应该只是将作业添加到队列中,以允许后台作业运行器在它们出现时拾取作业。
此处已回答类似问题Can I use threads to carry out long-running jobs on IIS?
编辑:严重不推荐替代
如果您坚持或别无选择,只能在IIS进程中运行后台作业,则需要考虑允许后台作业自动停止,并允许它从停止时停止的位置重新启动。
您可以拥有一个可以轮询的URL,以触发重新启动未完成的作业。
我过去看过这项工作,实施的复杂程度会因后台工作的需要而有所不同。
您会发现服务器可能会出现性能问题,因为后台作业会重复启动和终止。
答案 1 :(得分:0)
虽然上面的答案是可以接受的,但是在网络应用程序中托管长期运行的服务有一些优点。
Rick Strahl在这里有一篇关于它的博客文章: Use-IIS-Application-Initialization-for-keeping-ASPNET-Apps-alive