C# 如何在windows azure worker角色中计划任务

C# 如何在windows azure worker角色中计划任务,c#,azure,C#,Azure,我有一个简单的Azure Worker角色,每天下午12点执行一项任务。下面是实现这一点的代码 public override void Run() { try { while (true) { int time = Convert.ToInt32(DateTime.Now.TimeOfDay); if (time == 12) {

我有一个简单的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点发送电子邮件的方法,并且每天只触发一次

我如何实现一个调度程序,当时间为中午12点时启动并执行
DoSomethingElse()


我的问题是:这(上面的代码)是最好的方法还是使用任何第三方工具

这里还有其他几个问题可以解决这个问题(我在上面标出了一个)。话虽如此,但冒着重复其他答案的风险:


在您的情况下,在WindowsAzure队列上发送一条简单的消息,延迟到中午才显示,就可以了。这也有助于处理多实例场景:如果您正在运行角色的两个实例,您不希望同一个计划任务运行两次,因此您需要一种方法,让这些实例中的一个只执行此代码。这很容易通过队列消息来处理,或者您可以在单个实例上运行调度程序代码,方法是使用blob租约(可能只有一个写锁)作为互斥锁。这在@smarx的博客文章中有介绍。

您也可以使用Quartz.Net 使用上面提到的blob租约是确保只有一个实例承载任务的好方法


云调度器专门处理云中的任务调度

我刚遇到这个,所以我没有试过

更新:忘记云计划程序!我连续600次运行我的每日计划,结果600封电子邮件被发送给我的客户。不要使用

使用。很好的教程斯科特顾

具体地说,我将研究存储队列操作类型—只需在工作人员角色中注册队列事件


(请注意,如果您想安排比每小时更频繁的任务,此服务可能需要花费金钱。)

可能重复的另一个注意事项是,您的上述代码将导致紧密循环,以100%的速度持续运行CPU,并可能导致Azure重新启动您的工作者角色。你至少需要在那里写一份睡眠声明。或者使用计时器等待。但是,在任何情况下,由于多实例,您需要寻找调度的其他答案,如Makogon所说的。但我怀疑,如果我通过队列消息实现它,同样的问题仍然存在,因为多实例将同时创建多个que消息。?是的,这是一个启动问题。考虑一个互斥锁通过BLB锁。@smarx在他的博客文章中介绍了这一点。Azure现在有一个简单的调度程序服务,它可以根据高度可配置的调度调用端点。问题是它不适用于长时间运行的进程。超时时间为30秒,不可配置。“这很容易通过队列消息处理”,但如何确保每天只添加一条队列消息?我同意。这是最简单的方法。只需使用webhook来触发事件。然而,Azure任务调度程序的成本却高得离谱。