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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top