0

我有一个 MVC3 剃须刀页面,基本上可以做到这一点

[HttpPost]
public ActionResult Index(Mymodel model)
{
//run background process
return(model);
}
public backgroundprocesscompleted()
{
//write to database
}

运行后台进程部分通过库运行分析,然后在完成后运行 backgroundprocesscompleted。这整件事适用于小文件(46 行),但是当我在更大的文件(11k)上执行此操作时,它在 IIS 上运行并且似乎超时。我更改了许多设置,但仍然超时。本质上,我想做的是强制 Web 应用程序永不超时。关于如何解决这个问题的任何好主意?谢谢

4

1 回答 1

3

ASP.Net 中运行时间较长的后台进程可能失败的原因有多种,包括

  • 与请求无关的线程中未处理的异常将取消该进程。
  • 您的站点运行的 AppDomain 可能由于多种原因而关闭,并使用它取消您的后台任务。
  • 当你修改 web.config 时,ASP.NET 会回收 AppDomain
  • IIS 将每 29 小时自行回收整个 w3wp.exe 进程(默认情况下)
  • 在共享托管环境中,许多 Web 服务器被配置为在一段时间不活动后拆除应用程序池

http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx

上面链接的文章为减轻这些风险提供了一些建议。但是,我建议完全在 ASP.Net 之外进行长时间运行的处理。一种直接的方法是将工作写入事务性 MSMQ 队列,并让 Windows 服务从该队列中读取工作项并处理它们。

于 2012-10-11T17:21:36.877 回答