C# 如何在windows azure worker角色中计划任务
我有一个简单的Azure Worker角色,每天下午12点执行一项任务。下面是实现这一点的代码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) {
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任务调度程序的成本却高得离谱。