我有一个在ASP.NET中运行的Azure 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一次,看看是否是“运行时间”,但我不一定想这样做。
发布于 2014-11-19 16:29:51
正如已经在评论中提到的,你最好将“长时间运行”的任务从你的网站中分离出来,你仍然可以将它作为单独的项目保留在同一个解决方案中,以使共享业务逻辑代码变得更简单,并且只需部署到两个不同的环境-网站+ WebJob,网站+ WebWorker
您可以尝试在IIS上使用长时间运行的任务来缓解此问题,请参阅此处的一些资源:
基于Scott Hanselman - How to run Background Tasks in ASP.NET -- gihub和corresponding blog post, recommended read
以上任何一项都不能保证你的任务/工作会完成,不管怎样,回收都会杀死它。
如果你的“长时间运行”任务是为MVC预加载数据,你仍然可以将其提取到单独的服务中,并通过缓存(worker填充缓存)、DocumentDB/SearchAPI (worker每小时预置它们)、WorkerRole中的自托管API使数据可供调用。
如果您的任务不是毫秒敏感的,您可以在之前使用服务总线完成一小时后安排您的任务-通过将消息添加到设置了ScheduledEnqueueTimeUtc的队列中-这应该足够了。
https://stackoverflow.com/questions/26997343
复制相似问题