【问题标题】:Launching a stored-procedure with Task.Factory.StartNew使用 Task.Factory.StartNew 启动存储过程
【发布时间】:2015-02-08 20:09:38
【问题描述】:

我正在尝试开发一个调用存储过程的 Web 服务。这个存储过程很长(大约 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 调度程序。

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

有什么特别的事情要做吗?

【问题讨论】:

  • 你是如何在 azure 调度程序中运行它的?在 ASP.NET 应用程序中?
  • 我使用 Microsoft azure 管理控制台(图形);有了它,可以启动准时或周期性的任务;多亏了这个,我启动了我的网络服务。
  • 网络服务是一个什么样的应用程序?类库?
  • Web 服务是在控制器中调用的方法(ASP.NET MVC5)
  • 我假设您的 ASP.NET 托管在 IIS 中?

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


【解决方案1】:

您遇到的是 IIS 超时。一旦 IIS 检测到不活动,it will terminate the app pool:

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

发生这种情况是因为Task.Factory.StartNew 没有向 IIS 注册工作,因此它不知道您当前正在进行活动的工作。

为避免这种情况,如果您使用的是 .NET 4.5.2,您可以使用 HostingEnvironment.QueueBackgroundWorkItem 在 ASP.NET 线程池线程上注册和排队工作。

如果您使用的是以前的版本,则可以使用 Stephan Cleary 的 BackgroundTaskManager

如需了解更多信息,请阅读 .NET Web 开发团队的 this post

【讨论】:

    猜你喜欢
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多