Вопрос по c# – Как запланировать задачу в рабочей роли Windows Azure

8

У меня запущена простая роль рабочего Azure, которая выполняет задачу каждый день в 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:00 и выполняетDoSomethingElse().

Мой вопрос: является ли это (приведенный выше код) лучшим методом или использовать какой-либо инструмент стороннего производителя.

Напомним, что приведенный выше код вызовет замкнутый цикл с постоянной загрузкой ЦП на 100% и может заставить Azure перезапустить вашу рабочую роль. Вам нужно, по крайней мере, поместить в это утверждение сна. Или используйте таймер для ожидания. Но, в любом случае, из-за нескольких экземпляров вам нужно искать другие ответы на расписание, как то, о чем говорит Макогон. Frans

Ваш Ответ

4   ответа
1

http: //quartznet.sourceforge.net Использование упомянутой выше аренды блобов - отличный способ убедиться, что только один из ваших экземпляров выполняет задачи хостинга.

Использование Quartz.Net для планирования заданий в рабочих ролях Windows Azure

5

которые касаются этого (и я отметил один выше). Сказав это, и рискуя повторить, что другие ответы уже заявляют:

В вашем случае будет работать простое сообщение в очереди Windows Azure с задержкой по времени, которое не будет отображаться до полудня. Это также помогает справляться со сценариями с несколькими экземплярами: если вы запускаете два экземпляра своей роли, вы не хотите, чтобы одна и та же запланированная задача выполнялась дважды, поэтому вам нужен способ, чтобы только один из этих экземпляров выполнял этот код. Это легко обрабатывается с помощью сообщения очереди, или вы можете запустить код планировщика для одного экземпляра, используя что-то вроде аренды BLOB-объекта (который может иметь только одну блокировку записи) в качестве мьютекса. Это описано в блоге @ smarx,Во.

«Это легко обрабатывается с помощью сообщения в очереди». Но как обеспечить добавление только одного сообщения в очередь каждый день? Mike Asdf
Правда, это проблема запуска. Рассмотрим мьютекс через блокировку BLOB-объектов. @smarx рассказал об этом в своем блогеВо. David Makogon
Но я сомневаюсь, что, если я реализую его через сообщение очереди, та же проблема все еще существует, потому что несколько экземпляров создадут несколько сообщений очереди одновременно.? Hope
Azure теперь имеет простой сервис планировщика, который вызывает конечную точку на основе настраиваемого расписания. Проблема в том, что он не работает для длительных процессов. Тайм-аут составляет 30 с и не настраивается. AntonK
0

Я только что столкнулся с этим, поэтому я не пробовал.

http: //getcloudscheduler.com

Обновит: Забудьте облачный планировщик! Я запускал свой ежедневный график 600 раз подряд, в результате чего 600 писем отправлялось моим клиентам. Не используйте !!!

0

Azure Task Scheduler. Хороший урок от Скотта ГуВо.

В частности, я хотел бы взглянуть на тип действия «Очередь хранилища» - просто зарегистрируйте события очереди в своей рабочей роли.

(Обратите внимание, что эта услуга может стоить денег, если вы хотите планировать задачи чаще, чем каждый час.)

Я согласен. Это самый простой способ. Просто используйте веб-крючок, чтобы вызвать событие. Планировщик заданий Azure смехотворно дорог, как бы то ни было. Peter de Bruijn

Похожие вопросы