Windows Forms - Refresh, DoEvents, Sleep

Utilização

Todos sabemos da importância do trabalho e do descanso em nossas vidas e, pode acreditar, uma aplicação não é diferente.

A aplicação tem que ser a mais rápida e eficiente possível certo ? Certo. Porém algumas vezes temos que fazer algumas considerações.
Sabe aquela ideia que o bom é inimigo o ótimo? Pois é.

Você sabe que o computador é incapaz de executar 2 coisas ao mesmo tempo. Mesmo sendo o processador multi-núcleos( Multithreading ), multi-tarefas, multi-preemptivo ou não, eles só são capazes de executar uma coisa de cada vez. O que o sistema faz é 'chavear' o tempo entre as tarefas de maneira que 'parece' que executa 2 coisas ao mesmo tempo mas na realidade não faz isso mesmo. Note que ao chavear a execução das tarefas no tempo diminui a eficiência total do sistema na execução de cada tarefa.

Sabemos que nossas aplicações rodam sobre o sistema operacional. Sendo assim as tarefas das nossas aplicações tem prioridade ( rodam em primeiro plano ) sobre as aplicações do sistema operacional que rodam 'em segundo plano'.

Por exemplo, temos uma tarefa A que está rodando e uma outra tarefa B que deverá ser executada, invocada pela mesma tarefa A ou não. Aí o sistema tem que tomar uma decisão :

• 1-Parar a execução da tarefa A para executar a tarefa B porque a tarefa B é importante. Isso diminui a eficiência da execução da tarefa A mas como a tarefa B é importante, tem que ser feito.

• 2-NÃO devo parar a execução da tarefa A para executar a tarefa B porque a tarefa B é NÃO é importante. Isso aumenta a eficiência da execução da tarefa A e a tarefa B terá que aguardar o término da tarefa A para ser executada se é que a tarefa A terminará.

Contudo o computador num programa executa o que foi programado para fazer e não aquilo que você gostaria que ele fizesse ( lei de Murphy para a informática ). Sendo assim nós devemos determinar o que é e o que não é importante.

Sempre que o windows está executando uma tarefa ela tem a máxima importância no sistema, tem o foco e é chamada de 'aplicação de foreground' ou principal.

Contudo temos tarefas em 'background' que são importantes também. Por exemplo, podemos incluir uma simples mensagem num listbox que só será renderizado, atualizado e exibido ao término da aplicação corrente se é qua aplicação corrente terminará, ou seja, pode ser que nunca seja exibido corretamente.

Sendo assim, se a emissão da mensagem para o usuário é importante, temos que instruir nosso programa para que 'dê um tempo' para que o windows atualize o que precise ser atualizado ( o background ), ou seja, faça a renderização do elemento e exiba a mensagem.

Como fazer isso ?

Temos as seguintes instruções para que nosso programa dê a prioridade de execução para o windows:

Método Refresh

O método refresh informa ao sistema operacional que o elemento deve ser sua exibição atualizada. Contudo solicita mas a gente não manda no sistema operacional apenas 'sinaliza' que o elemento deve ser atualizado.

Exemplo de Uso : ListBox1.Refresh()

Método DoEvents

O método Application.DoEvents(). Este método faz com que nossa aplicação dê a prioridade de volta ao windows executar seus processos. Nesta instrução o windows iria 'renderizar' nosso listbox atualizado e assim exibiria a mensagem ao usuário.

Dando um tempinho extra

Imagine que sua app deu um erro e você termine ela imediatamente. Provavelmente o usuário sequer conseguiria ler uma mensagem ou tomar nota de um erro ocorrido.

Sendo assim podemos utilizar a instrução System.Threading.Thread.Sleep(5000) onde 5000 é o tempo em milisegundos, o que significa, 5 segundos.
Esta instrução faz com que a app aguarde, durma por 5 segundos antes de continuar a execução do próximo passo. É muito útil na interação como usuário ou com o sistema operacional quando mudamos uma pasta, eliminamos um arquivo ou usamos a instrução 'SendKeys'.

Como você pode ver nesta página algumas vezes dar um tempo para tomar um fôlego é fundamental, até para computadores, portanto mantenha sempre em sua mente, o mais importante é a sua saúde e o resto a gente vai atras.