sin*_*ino 0 c# asp.net asp.net-mvc iis-7 threadpool
所以我在MVC控制器方法里面有以下代码:
public ActionResult ProcessFile ()
{
ThreadStart threadStart = new ThreadStart ( ()=>{
// Doing some long processing that takes 20 minute
} );
Thread thread = new Thread(threadStart);
thread.Start();
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是当多个请求发送到此控制器方法时,线程被杀死.我需要Thread继续工作,直到处理结束,似乎资源占用了大量资源,线程可以继续工作.如果我从Windows应用程序或服务运行该过程它完美地工作,它只是从Web应用程序启动时遇到问题.
理想情况下,您不应该在IIS 7中创建Web请求的线程(对于长时间运行的后台作业).
如果app pool/AppDomain重新启动,线程将停止,这可能由于多种原因而发生,例如更改bin文件夹的内容,更改web.config,一段时间不活动,达到资源阈值(例如内存使用情况).事实上,默认情况下,AppDomain会定期重新启动,除此之外没有任何其他原因.
因此,应该使用作业队列和后台作业运行器来实现长时间运行的任务,例如控制台应用程序或Windows服务(重要的是,不在IIS的上下文中运行),处理这些作业.
Web请求应该只是将作业添加到队列中,允许后台作业运行器在它们出现时拾取作业.
这里回答了类似的问题我可以使用线程在IIS上执行长时间运行的作业吗?
编辑:一个严重不推荐的替代方案
如果您坚持或别无选择,只能在IIS进程中运行后台作业,则需要考虑允许后台作业自动停止,并允许它从停止时停止的位置重新启动.
您可以拥有一个可以轮询的URL,以触发重新启动未完成的作业.
我在过去看过这项工作,实施的复杂程度会因后台工作的需要而有所不同.
您会发现服务器可能会开始出现性能问题,因为后台作业会重复启动和终止.
| 归档时间: |
|
| 查看次数: |
4308 次 |
| 最近记录: |