Usando Threads e Timer em ASP.NET

Publicado: 15/10/2004 em IntoSpaces

Olá pessoal, esse artigo foi publicado inicialmente no site do GU-RJ em 07/01/2004, para acessarem vejam o link http://www.gurj.net/GRUPO/Artigos/ArtigosGURJ/186.aspx
ps: Estou formatando o texto ainda, por favor um pouco mais de paciência
———————————————————————————————–

Hoje abordarei um assunto um pouco comentado em ASP.NET : As fabulosas Thread’s e os Timers.

Resumindo : threads são processos simultâneos, ao processo principal que estamos utilizando.
Em Winforms são extremamente úteis para deixar a aplicação trabalhando em Background, enquanto a utilizamos para outros fins.
Em Webforms também podemos utiliza-las para nos beneficiar, um uso adequado seria quando grandes processamentos ocorrem no servidor, estourando o Timeout. 

No exemplo que será desenvolvido aqui, de quebra teremos a utilização de um Timer dentro de um Webform, o que também pode nos ser útil. 

Bom já é hora de começar a codificar, então vamos lá!! ^__^ 

Nosso artigo terá somente dois Webforms para desenvolvermos a idéia e testá-la, eles são default.aspx e time.aspx.
Usaremos codebehind e desenvolvimento com visual studio.net para facilitar, segue abaixo o código para default.aspx 

<%@ Page Language="vb" AutoEventWireup="false" Codebehind="default.aspx.vb" Inherits="thread.WebForm1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
      <HEAD>
            <title>WebForm1</title>
                        <meta name="GENERATOR" content="Microsoft Visual Studio .NET 7.1">
            <meta name="CODE_LANGUAGE" content="Visual Basic .NET 7.1">
            <meta name="vs_defaultClientScript" content="JavaScript">
                        <meta name="vs_targetSchema" content="
http://schemas.microsoft.com/intellisense/ie5">
      </HEAD>
      <body MS_POSITIONING="GridLayout">
            <form id="Form1" method="post" runat="server">
                  <asp:Button id="Button1" style="Z-INDEX: 101; LEFT: 24px; POSITION: absolute; TOP: 24px" runat="server"                       Text="Button"></asp:Button>
            </form>
      </body>
</HTML>

Notem que nesse trecho de código, não há nada de especial, apenas um Button.

Agora vejamos o código para default.aspx.vb, onde colocaremos em prática a nossa nova técnica, vou comentar o código para facilitar. 

Public Class WebForm1   Inherits System.Web.UI.Page

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 ‘No Load não disparamos nada
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
‘Ao clique no botão disparamos a Thread que aponta para a Sub tr
        Dim t As New System.Threading.Thread(AddressOf tr)
        t.Start() 

‘Para demonstrar a Thread funcionando usamos o redirect para ‘terminar a requisição
        Response.Redirect("time.aspx")   
End Sub 

Private Sub tr()
‘Com a Thread rodando iniciamos o timer que aponta para outro ‘procedimento, algo próximo do que foi feito com a thread ‘Setamos o "Tempo" do timer para 10000 milisegundos (10 segundos)

        Dim aTimer As System.Timers.Timer = New System.Timers.Timer(10000) 

‘Precisamos apontar o timer para algum procedimento, isso é feito ‘com o uso do AddHandler
        AddHandler aTimer.Elapsed, AddressOf OnTimedEvent
        aTimer.AutoReset = True
        aTimer.Enabled = True
End Sub 

Private Sub OnTimedEvent(ByVal obj As Object, ByVal e As System.Timers.ElapsedEventArgs)
‘Dentro do procedimento do Timer fazemos a nossa tarefa, que será ‘executada a cada N milisegundos. 

        Dim objWriter As IO.StreamWriter = New IO.StreamWriter(Server.MapPath("file.txt"))
        objWriter.WriteLine("ok")
        objWriter.Close()
End Sub
End Class
 

Bom vamos tentar dizer o que fizemos se bem que está bem auto-explicativo. Como foi comentado no código inicializamos a Thread e startamos ela. 

Dim t As New System.Threading.Thread(AddressOf tr)
      t.Start() 

Note o método de declaração, usando AddressOf, se formos escrevem em c# a sintaxe pode mudar um pouco, porém o conceito é o mesmo. 

Thread t = new Thread(new ThreadStart(tr));
t.Start(); 

Dentro do procedimento tr(), iniciamos o Timer.
O addHandler unido ao AddressOf nos possibilitam ligar o evento Elapsed do Timer a um procedimento, funcionando assim de uma forma parecida com o Timer do Winforms. 

Dim aTimer As System.Timers.Timer = New System.Timers.Timer(10000)     
AddHandler aTimer.Elapsed, AddressOf OnTimedEvent 

Em c# usaríamos Delegate para ligar o evento ao procedimento veja abaixo. 

System.Timers.Timer aTimer = new System.Timers.Timer(5000);
aTimer.Elapsed+=new ElapsedEventHandler(OnTimedEvent); 

A mágica já está pronta, depois de termos ligado o evento ao Procedimento OnTimedEvent, podemos fazer o que quiser dentro dele. 

Agora é a hora do teste, para ver se a nossa Thread realmente funciona junto do Timer, para isso temos o Webform time.aspx, que consiste em uma página simples que verfica no servidor a cada 1 segundo se o arquivo de responsabilidade da Thread já foi criado. 

Veja. 

<%@ Page Language="vb" AutoEventWireup="false" Codebehind="time.aspx.vb" Inherits="thread.time"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
  <head>
    <title>time</title>
     
<meta http-equiv="Refresh" content="1; URL=time.aspx">
  </head>
  <body MS_POSITIONING="GridLayout">
    <form id="Form1" method="post" runat="server"> 
    </form>
  </body>
</html>
 

O que dita o funcionamento da página é a tag Meta, resposável pelo Refresh a cada 1 segundo, pois bem, agora vamos ao codeBehind, time.aspx.vb 

Public Class time
    Inherits System.Web.UI.Page
… 

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ‘Put user code to initialize the page here
        Response.Write(IO.File.Exists(Server.MapPath("file.txt")))
    End Sub
End Class

 Sem segredos não? Somente verificamos se o arquivo já está criado, e imprimimos na tela True ou False. 

Com isso podemos verificar a funcionalidade que ficou agregada ao servidor, mesmo sem requisições, é como se ele fizesse hora extra pra gente.
Bom é isso, tentei ser o mais breve e direto possível mostrando como se faz realmente a coisa.

Espero que tenham aproveitado e que isso ajude em suas jornadas de trabalho.

———————————————————————————————–

É esse aí o artigo pessoal, vou postar outros aqui, têm alguma sugestão sobre algum assunto interessante? O que acharam deste? Aguardo o FeedBack de vocês!!

[]’s e até a próxima
Shinji

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s