2012-06-05 34 views
8

我有一个简单的Azure工作者角色在每天下午12点执行一项任务。以下是完成此操作的代码。如何在Windows Azure工作角色中安排任务

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()

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

+0

可能重复的 - 我怎么运行的Web服务调用一个函数每隔一小时的工作吗? ](http://stackoverflow.com/questions/8548159/azure-how-do-i-run-a-job-that-c​​alls-a-function-in-the-webservice-every-hour) –

+0

在一边 - 注意,上面的代码会导致严重的循环,CPU以100%的比例持续运行,并可能导致Azure重新启动您的辅助角色。你至少需要在那里发表睡眠声明。或者使用计时器等待。但是,无论如何,由于多实例,您需要像调用Makogon所说的那样寻找其他调度的答案。 – Frans

回答

5

这里有几个其他问题可以解决这个问题(我已经在上面标记了一个)。话虽如此,在重复什么其他的答案已经状态的风险:

在你的情况下,在Windows Azure的队列一个简单的信息,延时不显示,直到中午,会工作。这也有助于处理多实例场景:如果您正在运行角色的两个实例,则不希望相同的计划任务运行两次,因此您需要一种方法让这些实例中只有一个执行此代码。这很容易通过队列消息来处理,或者您可以通过使用像blob租约(它可能只有一个针对它的写入锁)作为互斥体,在单个实例上运行调度程序代码。这涵盖在@ smarx的博文中,here

+0

但我有一个疑问,如果我通过队列消息实现它仍然exixt becase多个实例将同时创建多个que消息。 – Hope

+1

确实,这是一个启动问题。考虑通过blob锁定的互斥锁。@smarx在他的博客文章[这里]中介绍了这一点(http://blog.smarx.com/posts/building-a-task-scheduler-in-windows-azure)。 –

+0

Azure现在有一个简单的调度程序服务,它根据高度可配置的时间表调用端点。问题是它不适用于长时间运行的进程。超时时间为30秒,不可配置。 – AntonK

0

云计划云计算中的任务调度专门处理。

我刚碰到这个,所以我没有尝试过。

http://getcloudscheduler.com/

更新:忘记云调度!我连续运行了600次我的日程安排,导致600封电子邮件被发送给我的客户。不要使用!

0

使用Azure Task Scheduler。 Scott Gu here不错的教程。

具体来说,我想看看存储队列动作类型 - 只是注册在你的Worker角色队列中的事件。

(请注意,如果你想更频繁地安排任务比每小时这项服务可能需要花钱。)[天青

+0

我同意。这是最简单的方法。只需使用webhook来触发事件。然而,Azure Task Scheduler的功能却非常昂贵。 –

相关问题