(WIN/C#/. NET) O applet precisa pesquisar no intervalo por hora - recomendações sobre o melhor método?

StackOverflow https://stackoverflow.com/questions/1538925

  •  20-09-2019
  •  | 
  •  

Pergunta

O Applet precisa pesquisar para a existência de um diretório, digamos, a cada 1-4 horas e enviar alguns e-mails/envio de rede, se não for encontrado. Ainda não tenho certeza do intervalo exato, mas definitivamente não será menor que 1 hora. O "trabalho" geral será permanente e continuamente correndo no futuro próximo. O Applet estará em execução em um servidor Win2K3 e, com base nos padrões de uso (extremamente leves) do usuário, duvido que interfira de qualquer maneira perceptível com as funções do servidor primário, mas apenas queira que seja bem-comportada, é claro! Considerado implementá -lo como um serviço de vitória eventualmente, mas por vários motivos, a primeira implementação será como um aplicativo de console.

Buscando a implementação que será mais magra em termos de uso de recursos do sistema, especificamente CPU e RAM. Mais preocupado com a implementação de tempo/votação versus uso da CPU. Não haverá uma tonelada de objetos, GUI, etc., então o uso do RAM não deve ser um problema, mas preciso dar uma consideração especial à coleta de lixo se implementar como um .exe de longa duração ( no sentido dos meses/anos)?

FileSystemWatcher?
System.timers.timer?
Thread.sleep?
outro?

Na verdade, enquanto escrevo isso, ocorre que a implementação mais simples - do ponto de vista de reutilizar as muitas "rodas" existentes já inventadas para esse tipo de tarefa - será não pesquisar, mas simplesmente projetá -lo para começar, Execute ações e feche e deixe as tarefas agendadas do Windows lidar com o aspecto de tempo. Mas eu postei de qualquer maneira para obter a validação dessa idéia + informações gerais para referência futura. Ty!

Foi útil?

Solução

A tarefa programada para o Windows é definitivamente o caminho a percorrer. E thread.sleep (n) é definitivamente não o caminho para seguir. UMA System.Timers.Timer Seria o caminho a percorrer se você fizesse isso em seu aplicativo, com um intervalo inicial de 3600000. Em cada evento decorrido, você deve desativar o cronômetro, fazer qualquer código que precisar fazer e depois reativar o cronômetro com um intervalo igual ao próximo horário de hora a hora, menos o tempo atual do sistema. Caso contrário, seu cronômetro desviará de sincronia com o tempo do sistema (embora isso possa não importar para seus propósitos, nesse caso para o inferno).

Outras dicas

Use serviços de agendamento do Windows para agendar a execução do seu aplicativo de console. Faça uma verificação simples para o diretório usando o diretório. Existe e envie e -mails conforme necessário.

Eu iria projetar -o para executar como um aplicativo sem cabeça (log no log de eventos ou na sua pia de escolha) e deixando o agendador de tarefas fazer seu trabalho e chamá -lo na hora.

Não há necessidade de complicar demais as coisas.

No passado, lidei com tarefas como essa simplesmente criando um aplicativo de console e executando -o a partir de uma tarefa programada para o Windows. Dessa forma, ele pode executar sua ação e depois descarregado da memória. Além disso, é fácil desativar temporariamente a tarefa programada se houver trabalho que precise ser feito no servidor (como atualizações do sistema). Além disso, o cronograma precisa mudar (com mais/menos frequência), a interface de tarefa programada já é responsável por várias execuções.

Tentamos escrever ferramentas semelhantes aos serviços do Windows (como você disse que pode ser uma implementação futura) por vários motivos:

  • Administração remota simples via net.exe (e eventualmente PowerShell)
  • Monitoramento fácil via Gerente de operações do centro do sistema (anteriormente mãe)
  • Pode cache dados/objetos, se necessário
  • estandardização

Observe que desenvolvemos uma estrutura e modelo associado para criar esses projetos; Dessa forma, cada projeto não precisa lidar com a configuração do intervalo de votação, etc.

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