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