 VB
.NET - Executando um método em um determinado horário
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