Como disparar um evento às 03:00 todas as noites?
-
18-09-2019 - |
Pergunta
Como se faz isso melhor? Eu quero um aplicativo que está sendo executado em um servidor para acionar um evento todas as noites às 03:00.
Solução
Use tarefas do Windows Scheduler
Outras dicas
Se você quiser fazer isso no correr código do aplicativo (em vez de usar um agendador de tarefas), você deve escolher uma duração de deixar o seu sono aplicativo que é bastante longo (por exemplo, 1 hora, ou 3.600 seg). Seu aplicativo loops e como cada chamada sono expira, o aplicativo verifica periodicamente quanto tempo resta até que o tempo limite estipulado (03:00). Uma vez que o tempo de sono restante fica abaixo do intervalo de tempo grosseiro, deve ser reduzida a um intervalo mais curto (para metade de cada vez, ou reduzida a 10 seg). Continuar o loop, dormir e reduzir o intervalo de tempo, até que o tempo limite estipulado alvo é atingido.
Isso impede que o laço de acordar demasiado frequentemente (86.400 intervalos de 1 seg é um exagero), mas também evita o loop aplicativo de ultrapassar o tempo limite estipulado alvo por dormir muito tempo.
Você poderia fazer um temporizador com um intervalo de 1 segundo e quando o temporizador se apaga, cheque se é 3:00.
Você precisa construí-lo em um serviço, a fim de garantir que ele é executado, mesmo se não há ninguém conectado na máquina, em seguida, existem muitos métodos diferentes para garantir que o disparo ocorre.
Considere fazer um System.Timers.Timer
onde o Interval
está definido como a diferença entre DateTime.Now
ea próxima 3:00.
Existem duas opções básicas aqui.
Se você está tentando fazer isso dentro de um serviço já existente, você pode usar um Contador para desencadear-se às 3:00 cada noite, e executar o seu "tarefa".
Dito isto, este é tipicamente melhor tratada através tarefas do Windows Scheduler . Em vez de manter a aplicação vivo 24/7, basta programá-lo para ser executado uma vez por dia às 3:00.
Editar:
Se você precisa trabalhar com o Agendador de Tarefas a partir do código (mencionado em outro comentário), que também é possível. O Agendador de Tarefas fornece uma API para a criação de Tarefas individuais ( ITask ) através do agendador de Tarefas ( ITaskScheduler ).
No entanto, dado que você está trabalhando em XP Embedded, você é provavelmente melhor fora apenas usando as capacidades de configuração do sistema normais, ea criação de uma tarefa para ser executada uma vez por dia. Em um sistema embarcado, você deve ter controle suficiente durante a implantação de fazer isso.
Aqui está uma versão simplificada de um serviço que escreveu que corre um temporizador a cada 60 segundos para assistir a uma mesa ... você poderia alterar o evento timer decorrido para verificar o tempo e executá-lo em seguida:
Dim Timer As System.Timers.Timer
Protected Overrides Sub OnStart(ByVal args() As String)
Timer = New System.Timers.Timer(60000)
AddHandler Timer.Elapsed, AddressOf timer_Elapsed
Timer.Start()
End Sub
Protected Overrides Sub OnStop()
Timer2.Stop()
End Sub
Private Sub timer_Elapsed(ByVal pSender As Object, ByVal pargs As System.Timers.ElapsedEventArgs)
'Ensure the tick happens in the middle of the minute
If DateTime.Now.Second < 25 Then
Timer.Interval = 65000
ElseIf DateTime.Now.Second > 35 Then
Timer.Interval = 55000
ElseIf DateTime.Now.Second >= 25 And DateTime.Now.Second <= 35 Then
Timer.Interval = 60000
End If
'Logic goes here
End Sub
Obviamente, se você puder, use o agendador de tarefas como todo mundo aqui tem mencionado. É a maneira preferida de fazer isso. Aconteceu de eu ter este código, que volta, então eu pensei que eu ia postar-lo caso isso pudesse ser útil para você. Além disso, este código funcionou para nós porque nunca sabia quando um servidor externo estava indo para editar uma tabela. Definir o intervalo para um número correto de milissegundos seria uma maneira muito mais eficiente de fazer isso, como fora apontado por md5sum.
Esta resposta poderia ser um campo deixou pouco, mas muitas vezes usamos CruiseControl.NET para algumas das nossas tarefas agendadas. Não é perfeito para todos eles, mas se é um grande trabalho que você deseja executar todas as noites e outro código / resultados dependem dele, então é uma boa escolha. Você pode programá-lo para ser executado sempre, receber e-mails se funcionou / falhou. Executar outros scripts / código se ele não funcionou, os arquivos a limpeza você precisa antes de começar e depois.
Nem a solução perfeita para todas as situações, mas é maldito poderosa para aqueles que a chamada para ele. Vamos utilizá-lo para alguns de nossos grandes de processamento de dados empregos, e isso nos envia todos um e-mail se ele trabalhou / falhou e vai mesmo tentar novamente 30 minutos mais tarde, se ele falhou pela primeira vez. Ele lhe dá uma sensação difusa bom:)
Windows agendador de tarefas (como sugerido por klausbyskov) ou um trabalho SQL Server.
EDIT:
Ou se você quiser um tempo dyanically atribuído, você pode criar um serviço do Windows que pesquisa a cada 10 minutos e realiza alguma ação no tempo desejado (s).
Criando um servidor windows em C # é bastante trivial e que poderia fazer isso . Apenas certifique-se que você tem a segurança e registro descobri porque ele pode ser muito difícil dizer o que está acontecendo ao mesmo tempo que é (ou não é) em execução.
Use System.Threading.Timer .
Eu estou gerando uma thread de uma aplicação ASP.NET para fazer tarefas agendadas.
Depende do que você tem disponível para você.
Sua melhor aposta é usar um cron trabalho, se você estiver em Linux / Unix / Mac OS X, um agendador de tarefas no Windows, ou launchd em versões mais recentes do Mac OS X .
Se você quiser fazer isso a partir de um aplicativo, você precisaria de um loop que verifica o tempo em uma base regular e dispara o evento se é 03:00, mas isso não é o ideal.
O programa é capaz de executar via linha de comando? Se assim for, criar um arquivo foo.bat, e chamar sua linha de comando do programa (muito simples).
Em seguida, use Agendador de Tarefas para executar o arquivo .bat às 3 da manhã diariamente.