2012-06-05 6 views
8

Tengo una función simple Trabajador Azure ejecutándose que realiza una tarea todos los días a las 12 PM. A continuación se muestra el código que logra esto.Cómo programar una tarea en la función de trabajador azul de Windows

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); 
    }    
} 

Aquí DoSomethingElse() es un método para enviar un correo electrónico a todos los días 24:00, y también se dispara una vez y sólo una vez por día.

¿Cómo puedo implementar un planificador que se active cuando la hora es 12 PM y ejecute DoSomethingElse().

Mi pregunta es: ¿Es este (código anterior) es el mejor método o utiliza cualquier herramienta de terceros.

+0

posible duplicado de [Azul - ¿Cómo se ejecuta un trabajo que llama a una función en el servicio web a toda hora? ] (http://stackoverflow.com/questions/8548159/azure-how-do-i-run-a-job-that-calls-a-function-in-the-webservice-every-hour) –

+0

En un lado -nota, su código anterior causará un ciclo cerrado, ejecutando la CPU constantemente al 100% y puede hacer que Azure reinicie su rol de trabajador. Por lo menos necesitas poner una declaración de suspensión allí. O usa un temporizador para esperar. Pero, en cualquier caso, debido a la multiinstancia, debe buscar otras respuestas a la programación, como lo que Makogon está hablando. – Frans

Respuesta

5

Hay varias otras preguntas aquí que tratan sobre esto (y he marcado uno más arriba). Una vez dicho esto, y corriendo el riesgo de repetir lo que otras respuestas ya dicen:

En su caso, un simple mensaje en una cola de Windows Azure, con retardo de tiempo para no aparecer hasta el mediodía, funcionaría. Esto también ayuda a lidiar con escenarios de varias instancias: si está ejecutando dos instancias de su rol, no desea que la misma tarea programada se ejecute dos veces, por lo que necesita una forma de tener solo una de esas instancias para ejecutar este código. Esto se maneja fácilmente a través de un mensaje de cola, o puede ejecutar el código del planificador en una sola instancia mediante el uso de algo así como un arrendamiento de blob (que solo puede tener un bloqueo de escritura contra él) como un mutex. Esto está cubierto en la publicación de blog de @ smarx, here.

+0

Pero tengo una duda de que si lo implemento a través del mensaje de cola, el mismo problema todavía existe porque múltiples instancias crearán múltiples mensajes a la vez ...? – Hope

+1

Es cierto, es un problema de inicio. Considere un mutex a través de blob [email protected] lo cubrió en su publicación de blog [aquí] (http://blog.smarx.com/posts/building-a-task-scheduler-in-windows-azure). –

+0

Azure ahora tiene un servicio de planificador simple que llama a un punto final basado en un horario altamente configurable. El problema es que no funciona para procesos de larga ejecución. El tiempo de espera es de 30 segundos y no es configurable. – AntonK

0

Nube Programador se ocupa específicamente de la programación de tareas en la nube.

Acabo de encontrar esto, así que no lo he probado.

http://getcloudscheduler.com/

actualización: Olvídese de la nube programador! Ejecuté mi agenda diaria 600 veces consecutivas, lo que resultó en 600 correos electrónicos enviados a mis clientes. No usar !!!

0

Utilice Azure Task Scheduler. Buen tutorial de Scott Gu here.

Específicamente, me gustaría ver el tipo de acción Storage Queue: simplemente regístrese para los eventos de cola en su Rol de trabajador.

(Tenga en cuenta que este servicio puede costar dinero si desea programar tareas con mayor frecuencia que cada hora.)

+0

Estoy de acuerdo. Esta es la manera más sencilla. Solo usa un webhook para activar el evento. Sin embargo, Azure Task Scheduler es ridículamente caro por lo que hace. –

Cuestiones relacionadas