我有一个我在Azure中运行的ASP.NET MVC站点。有一项工作我想每小时开始一次更新数据。
我目前每小时都有一个Azure作业设置,可以点击调用“数据加载”服务的控制器/操作方法。
public JsonResult Load()
{
Task.Factory.StartNew(() => DataService.LoadData());
return Json(new { success = true }, JsonRequestBehavior.AllowGet);
}
这样就可以启动流程并允许Azure作业“成功”
然而,这项工作现在正在运行它自己的线程,我认为这是不安全的。我将代码包装在try / catch中,有时我会看到一个线程中止记录。如何在没有线程中止的情况下成功运行这个5-10分钟的数据加载?
此外,我只希望在5-10分钟的数据加载发生后1小时内再次运行该作业。
因此,如果负载在上午8点开始并在8:10结束,我不希望下一次数据加载发生到8:11(依此类推)
显然我目前没有为此设置。从理论上讲,我可以设置一个工作来每分钟ping一次并查看它是否“运行时间”,但我不一定要这样做。
答案 0 :(得分:0)
正如评论中已经提到的那样,您最好将“长时间运行”的任务与您的网站分开,您仍然可以将其保存在与分离项目相同的解决方案中,以使共享业务逻辑代码更简单,只需部署到两个不同的环境 - Website + WebJob,Website + WebWorker
您可以尝试缓解IIS上长时间运行的任务的问题,请参阅此处的一些资源:
以上保证您的任务/工作无法完成,无论如何,回收都会杀死它。
如果您的“长时间运行”任务正在为MVC预加载数据,您仍然可以将其提取到单独的服务,并使您的数据可用于通过缓存(工作人员填充缓存),DocumentDB / SearchAPI(工作人员每小时预先准备一次),在WorkerRole中自托管API。
您可以在上一次完成Service Bus后一小时安排任务 - 通过向设置了ScheduledEnqueueTimeUtc的队列添加消息 - 如果您的任务不是毫秒敏感的话,那就足够了。