我有一个简单的Azure Worker角色,每隔几秒就会执行一次任务。下面是完成此任务的代码。
public override void Run()
{
try
{
while (true)
{
DoSomething();
System.Threading.Thread.Sleep(3000);
}
}
catch (Exception ex)
{
Log.Add(ex, true);
}
}
我现在要做的是添加第二个任务DoSomethingElse(),每天只触发一次。我想到了几种方法来实现这个目标:
前两个解决方案让我觉得非常脆弱,没有额外的代码来处理服务停止和重新启动的情况。第三种解决方案让我感到有些过度杀伤。
我的问题是,在Azure辅助角色中以不同的时间间隔安排任务的最佳做法是什么?我有点偏爱直接使用.NET而不使用第三方库(虽然我不排除它)。
注意,上面的#3来自这个较早的问题Recommend a C# Task Scheduling Library
答案 0 :(得分:2)
前两个选项最简单,但它们很脆弱 - 特别是在云中,角色可以回收/负载平衡等等......如果持久性在内存中,甚至是基于云的磁盘,那么它将是脆弱的
除了其他第三方选项之外,您可以查看将计划和执行数据持久保存到外部存储(表服务,sql azure等等)。在定期计时器上,辅助角色可以查询将要执行的作业,记录启动然后运行作业。这也允许您可能扩展工作者角色的数量,因为它的持久性是外部的。
这可能会匆忙变得复杂但如果你在频率和记录运行时间保持简单,那么它可以相当直接。
答案 1 :(得分:1)
史蒂夫·马克思在Windows Azure how to build a task scheduler上的using blob leases上写了几个博客条目,我想你会觉得这非常有用。