Visual Basic, VB .NET, ASP, Active X, Access, SQL Server

VB: lidando com reentrância de eventos.

Há situações em que, no tratamento de um evento, você dispara o próprio evento novamente. Isto causa a reentrada no tratamento do mesmo evento e gera o que se chama de "cascata de eventos". Nas cascatas de eventos, seu programa entra num loop infinito de reentradas até que ocorre uma mensagem de "Stack Overflow" (estouro de pilha) e o programa vem abaixo. Um exemplo de situação destas é quando você está tratando um evento Click em uma ListBox e dispara eventos de Click na própria ListBox ao ajustar a seleção para um outro item diferente daquele que acabou de ser selecionado.

Para evitar estas situações, existe uma dica básica. Use uma variável booleana estática dentro do procedimento para sinalizar que ele está sendo tratado. Ao entrar no procedimento, o programa verifica se ele já está sendo tratado. Neste caso o programa abandona o procedimento e evita de entrar no loop infinito de reentradas. Caso a variável sinalize que o evento não está sendo tratado, o programa atribui True à variável e segue no tratamento do evento. No final do código que trata o evento, a variável é novamente posta em False.

Vale lembrar que deve-se sempre adicionar um tratamento de erros no procedimento. Neste tratamento de erros, a variável é posta em False. Caso contrário, se um erro ocorrer no procedimento, você nunca mais vai conseguir executá-lo, pois a variável ficará sempre sinalizando que o procedimento já esta sendo executado.

Veja abaixo um exemplo do que foi dito acima.

Private List1_Click ()

   On Error GoTo TrataErro

   Static bTratando as Boolean

   If bTratando Then Exit Sub 'tratamento já está em curso

   bTratando = True ' sinaliza que o tratamento está em curso

  ' faz o que tem de ser feito

   bTratando = False 'restaura o valor do sinalizador

   Exit Sub

TrataErro:

    'trata o erro

    bTratando = False

End Sub