首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Azure上的ASP.NET MVC“每小时”运行作业

Azure上的ASP.NET MVC“每小时”运行作业
EN

Stack Overflow用户
提问于 2014-11-18 22:59:50
回答 1查看 634关注 0票数 0

我有一个在ASP.NET中运行的Azure MVC站点。有一个作业我想每小时启动一次来更新数据。

我目前有一个Azure作业,每小时设置一次,以访问我的控制器/操作方法,该方法调用“数据加载”服务。

代码语言:javascript
复制
    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一次,看看是否是“运行时间”,但我不一定想这样做。

EN

回答 1

Stack Overflow用户

发布于 2014-11-19 16:29:51

正如已经在评论中提到的,你最好将“长时间运行”的任务从你的网站中分离出来,你仍然可以将它作为单独的项目保留在同一个解决方案中,以使共享业务逻辑代码变得更简单,并且只需部署到两个不同的环境-网站+ WebJob,网站+ WebWorker

您可以尝试在IIS上使用长时间运行的任务来缓解此问题,请参阅此处的一些资源:

基于Scott Hanselman - How to run Background Tasks in ASP.NET -- gihubcorresponding blog post, recommended read

  • Really的IRegisteredObject - WebBackgrounder -gihub解决方案是对所有技术的很好总结

以上任何一项都不能保证你的任务/工作会完成,不管怎样,回收都会杀死它。

如果你的“长时间运行”任务是为MVC预加载数据,你仍然可以将其提取到单独的服务中,并通过缓存(worker填充缓存)、DocumentDB/SearchAPI (worker每小时预置它们)、WorkerRole中的自托管API使数据可供调用。

如果您的任务不是毫秒敏感的,您可以在之前使用服务总线完成一小时后安排您的任务-通过将消息添加到设置了ScheduledEnqueueTimeUtc的队列中-这应该足够了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26997343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档