我正在运行一个简单的 Azure Worker 角色,每隔几秒执行一次任务。下面是完成此操作的代码。
public override void Run()
{
try
{
while (true)
{
DoSomething();
System.Threading.Thread.Sleep(3000);
}
}
catch (Exception ex)
{
Log.Add(ex, true);
}
}
我现在想做的是添加第二个任务 DoSomethingElse(),该任务每天触发一次且仅触发一次。我想了几种方法来实现这一目标:
- 添加一个计数器,每 n 个循环调用新任务
- 向新任务添加条件逻辑,将当前时间与一天中的规定时间进行比较
- 使用一些 TBD 调度程序库(例如 Quartz.NET)
前两个解决方案让我觉得非常脆弱,没有额外的代码来处理服务停止和重新启动的情况。第三个解决方案让我觉得可能有点矫枉过正。
我的问题是,在 Azure 辅助角色中按不同时间间隔安排任务的最佳实践是什么?我稍微倾向于坚持直接使用 .NET 而不是使用第三方库(尽管我不排除这种可能性)。
注意,上面的 #3 来自这个较旧的问题 Recommend a C# Task Scheduling Library
最佳答案
前两个选项是最简单的,但它们很脆弱 - 特别是在云中,角色可以回收/负载平衡等...如果持久性位于内存中,甚至是基于云中的磁盘,那么它将很脆弱.
除了其他第三方选项之外,您还可以考虑将计划和执行数据保存到外部存储(表服务、sql azure 等)中。在定期计时器上,辅助角色可以查询要执行的作业,记录启动情况,然后运行作业。这还允许您潜在地扩展辅助角色的数量,因为它的持久性是外部的。
这可能很快就会变得复杂,但如果你保持简单的频率和记录运行时间,它可能会相当简单。
关于c# - 在 Azure 辅助角色中以不同的时间间隔执行任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8283399/