我正在尝试开发一个调用存储过程的网络服务。该存储过程相当长(大约 1 小时 30 分),并且它在数据库中执行大量“计数”和“插入”操作。 为了启动此过程,我使用了 C# 类任务;这是示例:
[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 调度程序。
问题似乎不是存储过程,而是任务的使用(因为没有任务它也能工作)。
有什么特别的事情要做吗?
最佳答案
您遇到的是 IIS 超时。一旦 IIS 检测到不活动,it will terminate the app pool :
Otherwise, when you have 20 minutes without any traffic then the app pool will terminate so that it can start up again on the next visit.
发生这种情况是因为 Task.Factory.StartNew
没有向 IIS 注册工作,因此它不知道您当前正在进行事件。
为避免这种情况,如果您使用的是 .NET 4.5.2,则可以使用 HostingEnvironment.QueueBackgroundWorkItem
在 ASP.NET 线程池线程上注册和排队工作。
如果您使用的是以前的版本,则可以使用BackgroundTaskManager作者:斯蒂芬·克利里。
有关更多信息,请阅读 this post由 .NET Web 开发团队开发
关于c# - 使用 Task.Factory.StartNew 启动存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28398801/