在Azure辅助角色中以不同间隔执行任务

hug*_*dan 5 c# scheduled-tasks azure

我有一个简单的Azure Worker角色运行,每隔几秒执行一次任务.下面是完成此任务的代码.

    public override void Run()
    {
        try
        {
            while (true)
            {
                DoSomething();
                System.Threading.Thread.Sleep(3000);
            }

        }
        catch (Exception ex)
        {
            Log.Add(ex, true);
        }            
    }
Run Code Online (Sandbox Code Playgroud)

我现在要做的是添加第二个任务DoSomethingElse(),它每天触发一次,每天只触发一次.我想到了几种方法来实现这个目标:

  1. 添加一个每第n个循环调用新任务的计数器
  2. 将条件逻辑添加到新任务,将当前时间与指定时间进行比较
  3. 使用一些TBD调度程序库(例如Quartz.NET)

前两个解决方案让我觉得非常脆弱,没有额外的代码来处理服务停止和重新启动的情况.第三种解决方案让我感到有些过度杀伤.

我的问题是,在Azure工作者角色中以不同的时间间隔安排任务的最佳做法是什么?我有点偏爱直接使用.NET而不使用第三方库(虽然我不排除它).

注意,上面的#3来自这个较老的问题推荐一个C#任务调度库

bry*_*mac 2

前两个选项是最简单的,但它们很脆弱 - 特别是在角色可以回收/负载平衡等的云中......如果持久性位于内存中,甚至是基于云中的磁盘,那么它将很脆弱。

除了其他第三方选项之外,您还可以考虑将计划和执行数据持久保存到外部存储(表服务、sql azure 等)中。在定期计时器上,辅助角色可以查询要执行的作业,记录启动情况,然后运行作业。这还允许您潜在地扩展辅助角色的数量,因为它的持久性是外部的。

这可能会很快变得复杂,但如果你保持简单的频率和记录运行时间,它可能会相当简单。