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

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

我正在尝试开发一个调用存储过程的网络服务。该存储过程相当长(大约 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/

相关文章:

c# - 如果数字小于 10,则添加 0

c# - 定时器比 System.Threading.Timer 更可靠

.net - 使用 CruiseControl.NET 预处理器将常量传递给预定义的 block

java - 将 Azure Blob 项转换为 Java 文件对象

azure - Kusto 获取资源组和订阅信息

c# - 计算 Windows Mobile/CE 设备上的当前 CPU 使用率

java - 我如何将这个c#代码翻译成java

C# QR 位数组解码

azure - 我可以使用哪些工具将基础设施从 AWS 自动迁移到 Azure?

c# - 在 Windows 应用程序之间传递对缓冲区的引用