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

3

我正在尝试开发一个调用存储过程的Web服务。这个存储过程非常长(约1小时30分钟),它在数据库中执行许多“count”和“insert”操作。 为了启动这个过程,我使用了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调度程序。

问题似乎不在于存储过程,而是在任务的使用上(因为没有任务就可以正常工作)。

是否需要特别处理?


你是如何在Azure调度程序中运行它的?是在ASP.NET应用程序内部吗? - Yuval Itzchakov
我使用 Microsoft Azure 行政控制台(图形界面);通过它,可以启动定期或周期性任务;我也可以借助它来启动我的 Web 服务。 - Fabaud
这个 Web 服务是什么类型的应用程序?类库吗? - Yuval Itzchakov
Web服务是在控制器(ASP.NET MVC5)中调用的一种方法。 - Fabaud
这永远不会是可靠的。工作进程可能因为各种原因而在很短的时间内重新启动。特别是在 Azure 上,你永远不会有 90 分钟的可靠运行时间。 - usr
显示剩余2条评论
1个回答

3
你所遇到的是IIS超时问题。一旦IIS检测到无活动状态,它会终止应用程序池

否则,当您20分钟没有任何流量时,应用程序池将终止,以便在下次访问时重新启动。

这是因为Task.Factory.StartNew未向IIS注册工作,因此它不知道您当前正在进行的活动工作。
要避免这种情况,如果您使用.NET 4.5.2,则可以使用HostingEnvironment.QueueBackgroundWorkItem在ASP.NET线程池线程上注册和排队工作。
如果您使用的是早期版本,则可以使用Stephan Cleary的BackgroundTaskManager

更多内容,请阅读.NET Web开发团队的此篇文章


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接