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:


José Carlos Macoratti