我有一个简单的Azure Worker角色,每天下午12点执行一项任务。下面是完成此任务的代码。
public override void Run()
{
try
{
while (true)
{
int time = Convert.ToInt32(DateTime.Now.TimeOfDay);
if (time == 12)
{
DoSomethingElse();
}
}
}
catch (Exception ex)
{
Log.Add(ex, true);
}
}
此处DoSomethingElse()
是一种在每天中午12点发送电子邮件的方法,并且每天只会触发一次。
如何实现在时间12PM时触发并执行DoSomethingElse()
的调度程序。
我的问题是:这是(上面的代码)是最好的方法还是使用任何第三方工具。
答案 0 :(得分:5)
这里还有其他一些问题可以解决这个问题(我在上面标注了一个)。话虽如此,并且有可能重复其他答案已经陈述:
在您的情况下,Windows Azure队列上的一条简单消息会延时,直到中午才会显示,这样才能正常工作。这也有助于处理多实例场景:如果您正在运行两个角色实例,则不希望同一个计划任务运行两次,因此您需要一种方法只让其中一个实例执行此代码。这可以通过队列消息轻松处理,或者您可以在单个实例上运行调度程序代码,方法是使用类似blob租约(可能只有一个写入锁定)作为互斥锁。 @ smarx的博客文章here中介绍了这一点。
答案 1 :(得分:1)
你也可以使用Quartz.Net http://quartznet.sourceforge.net/ 使用提到的blob租约是确保只有一个实例托管任务的好方法。
Using Quartz.Net to Schedule Jobs in Windows Azure Worker Roles
答案 2 :(得分:0)
Cloud Scheduler专门处理云中的任务调度。
我刚刚遇到这个,所以我没试过。
更新:忘记云计划!我连续600次运行每日计划,导致600封电子邮件发送给我的客户。别用!!!
答案 3 :(得分:0)
使用Azure Task Scheduler。 Scott Gu here的精彩教程。
具体来说,我会查看存储队列操作类型 - 只需在您的工作者角色中注册队列事件。
(请注意,如果您想要比每小时更频繁地安排任务,这项服务可能会花钱。)