VB .NET - Executando um método em um determinado horário
Se você precisar algum dia executar um método em um horário determinado pode usar os recursos do delegate TimerCallback.
Basta você declarar o método contendo o código que você deseja que seja executado e definir a assinatura do método como um delegate System.Threading.TimerCallback. (tem que ser uma rotina e não uma função)
Você cria um objeto System.Threading.Timer e passa o método que você deseja executar com um objeto estado que o timer irá passar para o seu método quando o tempo expirar.
Em seguida você calcula a diferença de tempo entre o tempo atual e o tempo da execução desejada e configura o objeto Timer para disparar depois deste período.
A classe System.Threading.Timer permite realizar esta tarefa através da execução de um método referenciado pelo delegate TimerCallBack em intervalos pré-definidos. O método referenciado é executado no contexto de uma thread a partir do pool de threads.
A
classe Timer do namespace System.Threading fornece um
mecanismo para executar um método a intervalos
especificados. Você deve usar um delegate TimerCallback para especificar o método que você deseja que o Timer execute. Este delegate é especificado quando o timer é construido, e não pode ser alterado. O método não será executado na thread que criou o timer, mas será executado em uma thread fornecida pelo pool de threads (ThreadPool) fornecido pelo sistema. |
Obs: O delegate TimerCallback representa o método que lida com chamadas de um Timer.
Quando você cria um objeto Timer, define dois intervalos de tempo:
Vejamos a seguir um exemplo mostrando como usar este recurso:
Vou usar o Visual Basic 2008 Express Edition e criar uma aplicação console com o nome executaMetodoTempoDeterminado;
No código do exemplo temos o método ExecutaMetodoAs que calcula a diferença de tempo (TimeSpan) entre a hora atual e a hora definida na linha de comando e configura o objeto Timer para disparar depois deste intervalo de tempo:
A seguir inclua o seguinte código no módulo:
Imports System Imports System.Threading Imports System.Globalization Namespace Macoratti Class executaMetodoTempoDeterminado Public Shared Sub ExecutaMetodoAs(ByVal horaExecucao As DateTime) ' Calcula a diferença entre o tempo de execução definido e o tempo atual Dim tempoEspera As TimeSpan = horaExecucao - DateTime.Now ' verifica se um tempo anterior ao atual foi informado ' neste caso o timer sera disparado de imediato If tempoEspera < New TimeSpan(0) Then Console.WriteLine("Um tempo menor que o atual foi definido.") Console.WriteLine("O Timer será disparado imediatamente.") tempoEspera = New TimeSpan(0) End If ' Cria um Timer que dispara no tempo definido ' Um intervalo de -1 vai parar a execução Dim threadTimer As New Timer(AddressOf timerDisparado, "Timer disparado...", tempoEspera, New TimeSpan(-1)) End Sub Private Shared Sub timerDisparado(ByVal state As Object) Console.WriteLine("{0} : {1}", DateTime.Now.ToString("HH:mm:ss.ffff"), state) Console.WriteLine("Método principal completado... Pressione Enter.") End Sub Public Shared Sub Main(ByVal args As String()) Dim horaExecucao As DateTime ' Verifica se existe um tempo definido na linha de comando If args.Length > 0 Then ' Converte uma string paradatetime. Suporta somente o formato especificao no padrão DateTime(RFC1123) Try horaExecucao = DateTime.ParseExact(args(0), "r", Nothing) Console.WriteLine("hora Atual : " & DateTime.Now.ToString("r")) Console.WriteLine("hora da Execução : " & horaExecucao.ToString("r")) ExecutaMetodoAs(horaExecucao) Catch ex As FormatException Console.WriteLine("A hora da execução deve estar no formato :{0}{1}{2}", ControlChars.NewLine, ControlChars.Tab,_ CultureInfo.CurrentCulture.DateTimeFormat.RFC1123Pattern) End Try ' Aguarda... Console.WriteLine("Aguardando pelo Timer...") Console.ReadLine() Else Console.WriteLine("Informe a hora na qual você deseja que o método seja executado no formato :{0}{1} {2}", _ ControlChars.NewLine, ControlChars.Tab, CultureInfo.CurrentCulture.DateTimeFormat.RFC1123Pattern) End If End Sub End Class End Namespace |
Agora vamos mostrar como executar o programa.
- Abra um prompt de linha de comando e posicione-se na pasta onde esta o executável do seu aplicativo ou use um caminho absoluto.
- Em seguida informa o seguinte comando na linha de comando:
executaMetodoTempoDeterminado "Wed, 10 Jun 2009 10:04:00 GMT"
onde:
executaMetodoTempoDeterminado
- é o nome do seu .exe;
"Wed, 10 Jun
2009 10:04:00 GMT" - é a hora
que você deseja que o seu método seja executado;
OS parâmetros da linha de comando são aqueles parâmetros que se informam como argumentos de um arquivo executável. Por exemplo : arquivo.exe parametro1 parametro2 Os parâmetros são separados por um espaço |
Executando a linha de comando acima iremos obter:
1- A aplicação irá calcular o tempo e aguardará para executar o timer:
2- Atingindo o tempo definido o método será executado:
Eu sei é apenas VB .NET, mas eu gosto...
Referências:
http://msdn.microsoft.com/en-us/library/system.threading.timer.aspx
José Carlos Macoratti