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

时间:2011-11-27 03:20:01

标签: c# azure scheduled-tasks

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

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

        }
        catch (Exception ex)
        {
            Log.Add(ex, true);
        }            
    }

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

  1. 添加一个每第n个循环调用新任务的计数器
  2. 向新任务添加条件逻辑,将当前时间与指定时间进行比较
  3. 使用一些TBD调度程序库(例如Quartz.NET)
  4. 前两个解决方案让我觉得非常脆弱,没有额外的代码来处理服务停止和重新启动的情况。第三种解决方案让我感到有些过度杀伤。

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

    注意,上面的#3来自这个较早的问题Recommend a C# Task Scheduling Library

2 个答案:

答案 0 :(得分:2)

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

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

这可能会匆忙变得复杂但如果你在频率和记录运行时间保持简单,那么它可以相当直接。

答案 1 :(得分:1)

史蒂夫·马克思在Windows Azure how to build a task scheduler上的using blob leases上写了几个博客条目,我想你会觉得这非常有用。