我正在尝试开发一个调用存储过程的Web服务。这个存储过程很长(大约1小时30分钟),并且它有很多"计数"和"插入"在数据库中。 为了启动这个过程,我使用了C#Class任务;这是一个例子:
[HttpPost]
[Route("updateData/{date:datetime?}")]
public JsonResult UpdateData(DateTime? date) {
try {
Task.Factory.StartNew(() => Data.UpdateData(date), TaskCreationOptions.LongRunning);
return Json("UpdateData successfully started !");
}
catch (Exception e) {
return Json("Error UpdateData: " + e);
}
}
当我在当地环境中进行测试时,它可以工作;但是当我在Azure上工作时,该过程在大约30分钟后停止。
为了启动Web服务,我使用Microsoft Azure调度程序。
问题似乎不是存储过程,但似乎是在使用任务(因为没有任务它可以工作)。
有什么特别的事可做吗?
答案 0 :(得分:3)
您遇到的是IIS超时。 IIS检测到不活动后,it will terminate the app pool:
否则,当您有20分钟没有任何流量时,应用程序池将终止,以便下次访问时可以再次启动。
这是因为Task.Factory.StartNew
没有注册IIS,因此它不知道您目前正在进行有效的工作。
为避免这种情况,如果您使用的是.NET 4.5.2,则可以使用HostingEnvironment.QueueBackgroundWorkItem
在ASP.NET Threadpool线程上注册和排队工作。
如果您使用的是以前的版本,则可以使用Stephan Cleary的BackgroundTaskManager。
有关更多信息,请阅读.NET Web开发团队的this post