使用Task.Factory.StartNew启动存储过程

时间:2015-02-08 20:09:38

标签: c# .net azure stored-procedures task-parallel-library

我正在尝试开发一个调用存储过程的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调度程序。

问题似乎不是存储过程,但似乎是在使用任务(因为没有任务它可以工作)。

有什么特别的事可做吗?

1 个答案:

答案 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