Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Azure运行作业上的ASP.NET MVC“;“每小时”;_C#_Asp.net Mvc_Multithreading_Azure - Fatal编程技术网

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

C# Azure运行作业上的ASP.NET MVC“;“每小时”;,c#,asp.net-mvc,multithreading,azure,C#,Asp.net Mvc,Multithreading,Azure,我有一个ASP.NET MVC站点,我正在Azure中运行。我想每小时开始一次更新数据的工作 我目前每小时有一次Azure作业设置,以点击我的控制器/操作方法,该方法调用“数据加载”服务 通过这种方式,它启动了流程,并允许Azure作业“成功” 然而,这项工作现在正在自己的线程上运行,我认为这是不安全的。我将代码包装在try/catch中,有时我会看到记录了线程中止。我应该如何在没有线程中止的情况下成功运行这5-10分钟的数据加载 此外,我只希望在5-10分钟的数据加载发生后1小时内再次运行作业

我有一个ASP.NET MVC站点,我正在Azure中运行。我想每小时开始一次更新数据的工作

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

通过这种方式,它启动了流程,并允许Azure作业“成功”

然而,这项工作现在正在自己的线程上运行,我认为这是不安全的。我将代码包装在try/catch中,有时我会看到记录了线程中止。我应该如何在没有线程中止的情况下成功运行这5-10分钟的数据加载

此外,我只希望在5-10分钟的数据加载发生后1小时内再次运行作业

因此,如果加载在上午8点开始,在8:10结束,我不希望下一次数据加载发生在8:11之前(以此类推)


显然,我目前还没有准备好。理论上,我可以设置一个每分钟ping一次的作业,看看是否是“运行时间”,但我不一定要这样做

正如评论中已经提到的,您最好将“长期运行”任务与您的网站分离,您仍然可以将其保留在相同的解决方案中,作为分离的项目,以使共享业务逻辑代码更简单,并且只需部署到两个不同的环境-网站+WebJob、网站+WebWorker

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

  • 基于-WebBackgrounder-and的解决方案
  • 所有技术的总结都很好-
以上任何一项都不能保证您的任务/工作将完成,回收将终止它

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


您可以在上一次使用Service Bus完成任务一小时后安排您的任务—通过使用set将消息添加到队列—如果您的任务对毫秒不敏感,这就足够了。

您使用的是web和worker角色还是网站之类的角色?如果使用角色,为什么不创建一个工作者角色的XS实例来进行后台处理呢?我没有使用工作者角色。只是使用一个“网站”,我与调度ping。我看到的worker角色的问题是,它必须位于我当前的MVC解决方案True之外,但是如果您的业务/db逻辑位于解决方案中它自己的项目中,那么一个简单的引用将为您提供相同的逻辑/代码。作为主要工作者角色的原因之一,my 2cents用于运行循环代码。网站通常在使用Azure功能时(应用程序池回收/web应用程序进入睡眠状态的频率/等等)表现不佳。这就是它建造的目的。非常棒。
    public JsonResult Load()
    {
        Task.Factory.StartNew(() => DataService.LoadData());

        return Json(new { success = true }, JsonRequestBehavior.AllowGet);
    }