none
[VB.NET] Timer pára depois do primeiro TICK após conexão assíncrona. RRS feed

  • Pergunta

  • Opa,

    Estou fazendo um programa que verifica a conexão à um IP na Porta 80 a cada 3 segundos.

    No momento que o o timer executa a função de conexão ao host remoto, um outro timer de 5 segundos inicia (esse é o timeout, ele vai executar caso a conexão demore mais de 5 segundos para ser realizada)

    O código do timer é o seguinte:

    Private Sub tmWatchdogCheck_Tick() Handles tmWatchdogCheck.Tick Dim Watchdog As New TcpClient tmWatchdogCheck.Enabled = False lbWatchdog.Text = "Trying " + txWatchdogHost.Text + ":" + txWatchdogPort.Text tmWatchdogTimeout.Interval = (txWatchdogTimeout.Text * 1000) tmWatchdogTimeout.Enabled = True Debug.Print("Ticked!") Watchdog.BeginConnect(txWatchdogHost.Text, txWatchdogPort.Text, New AsyncCallback(AddressOf ConnProc), Watchdog) End Sub Private Sub tmWatchdogTimeout_Tick(sender As Object, e As EventArgs) Handles tmWatchdogTimeout.Tick lbWatchdog.Text = "Timeout! Will " + cbWatchdogAction.Text ''' ''' EXECUTE ACTION ''' If (cbWatchdogAction.Text = "Do Nothing") Then tmWatchdogCheck.Enabled = True Else ''' ''' DO OTHER STUFF ''' End If End Sub

    Private Sub ConnProc(ByVal AR As IAsyncResult)

            Dim Request As Byte() = Encoding.ASCII.GetBytes("GET / HTTP/1.1" + ControlChars.Cr + ControlChars.Lf + "Host: " + txWatchdogHost.Text + ControlChars.Cr + ControlChars.Lf + "Connection: Close" + ControlChars.Cr + ControlChars.Lf + ControlChars.Cr + ControlChars.Lf)
            Dim Watchdog As TcpClient = AR.AsyncState
            Dim Answer(100000) As Byte

            If (Watchdog.Connected = True) Then
                WatchdogNS = Watchdog.GetStream()

                lbWatchdog.Text = "Checking..."
                WatchdogNS.Write(Request, 0, Request.Length)
                WatchdogNS.Flush()

                lbWatchdog.Text = "Receiving..."
                WatchdogNS.Read(Answer, 0, CInt(Watchdog.ReceiveBufferSize))
                Debug.Print("Answer: " + Mid(Encoding.ASCII.GetString(Answer), 1, 10))

                lbWatchdog.Text = "Ok! " + TimeOfDay
                WatchdogNS.Close()
                Debug.Print("Receive end ")
            Else
                lbWatchdog.Text = "Failure!"
            End If

            tmWatchdogCheck.Enabled = True
            tmWatchdogTimeout.Enabled = False
            Debug.Print("Receive sub end")
            Application.DoEvents()
        End Sub



    O que está causando o problema eu já sei, é aquela linha do Watchdog.BeginConnect que é uma conexão assíncrona. Se eu tirar essa linha, tudo funciona que é uma beleza.

    Mais com ela no lugar, o Timer não funciona mais, mesmo que esteja ENABLED = TRUE e nem com o método Timer.Start()


    O que será? Tô perdidão!

    Abraços!

    sexta-feira, 21 de fevereiro de 2014 23:40

Todas as Respostas

  • Olá,

    Está dando algum erro, alguma exceção?


    Herbert Lausmann

    sábado, 22 de fevereiro de 2014 10:26
  • Olá,

    Está dando algum erro, alguma exceção?


    Herbert Lausmann

    Não!

    Não dá erro nenhum...
    Criei um outro timer pra ficar escrevendo no debug o estado e o tempo de intervalo do timer que pára de funcionar. E ele retorna sempre ENABLED e o tempo correto que estava.

    Fiz um botão pra chamar a função executada pelo timer pra testar se a função que parava de funcionar, e também funcionou perfeitamente.

    []'s

    sábado, 22 de fevereiro de 2014 21:15
  • Não dá erro nenhum...

    Criei um outro timer pra ficar escrevendo no debug o estado e o tempo de intervalo do timer que pára de funcionar. E ele retorna sempre ENABLED e o tempo correto que estava.

    Fiz um botão pra chamar a função executada pelo timer pra testar se a função que parava de funcionar, e também funcionou perfeitamente.

    []'s

    Estranho. Eu já tive este problema no passado, mas não consigo me lembrar o que eu fiz para solucionar...

    Herbert Lausmann

    • Sugerido como Resposta Giovani Cr sexta-feira, 28 de fevereiro de 2014 18:47
    • Não Sugerido como Resposta Giovani Cr sexta-feira, 28 de fevereiro de 2014 18:47
    • Marcado como Resposta Giovani Cr quinta-feira, 6 de março de 2014 11:20
    • Não Marcado como Resposta Giovani Cr quinta-feira, 6 de março de 2014 11:20
    domingo, 23 de fevereiro de 2014 09:42
  • Verifique a janela Imediate Window para ver se ocorreu alguma exceção. Durante a execução do aplicativo, depois que o timer "para" de funcionar dê um pause no debugger e verifique o IntelliTrace pra ver se ele detectou algum erro.

    Timers não param de funcionar assim...


    Herbert Lausmann

    Meu BlogMeu perfil no Facebook

    quinta-feira, 6 de março de 2014 16:20