Ho un semplice ruolo di Azure Worker in esecuzione che esegue un'attività ogni pochi secondi. Di seguito è riportato il codice che compie questo.Esecuzione di attività a intervalli diversi nel ruolo di Azure Worker
public override void Run()
{
try
{
while (true)
{
DoSomething();
System.Threading.Thread.Sleep(3000);
}
}
catch (Exception ex)
{
Log.Add(ex, true);
}
}
Quello che mi piacerebbe fare ora è aggiungere un secondo compito DoSomethingElse() che spara una volta e solo una volta al giorno. Ho pensato a un paio di modi per ottenere questo risultato:
- aggiungere un contatore che chiama la nuova attività ogni ciclo ennesima
- Aggiungere la logica condizionale per la nuova attività che mette a confronto il tempo corrente per un tempo prescritto di giorno
- utilizzare alcuni biblioteca TBD scheduler (come Quartz.NET)
le prime due soluzioni mi sembrano molto fragile, senza codice aggiuntivo per affrontare situazioni in cui il servizio viene arrestato e riavviato. La terza soluzione mi sembra potenzialmente eccessiva.
La mia domanda è, qual è la procedura migliore per pianificare le attività a intervalli diversi all'interno di un ruolo di Azure Worker? Ho una leggera preferenza per attaccare con .NET dritto e non usare una libreria di terze parti (anche se non lo escludo).
nota, # 3 di cui sopra deriva da questa domanda più vecchio Recommend a C# Task Scheduling Library
Diciamo per il momento che mantengo i dati di esecuzione in un database SQL Azure. Potrei creare un semplice controllo in DoSomethingElse() che esegue il ping del database per determinare quando l'attività è stata eseguita l'ultima volta. Ciò significherebbe eseguire il ping del database per eseguire tale controllo ogni 3 secondi. È una cattiva idea? Sono molti viaggi inutili nel database. Tuttavia, è improbabile che il server di database sia messo a dura prova da transazioni così banali. Pensieri? – hughesdan