Ciao Wolt
Questo esempio è equivalente al tuo:
private void button1_Click(object sender, EventArgs e)
{
label1.Text = "Start";
int Tempo = 10;
do
{
Thread.Sleep(1000);
Tempo = Tempo - 1;
}
while (Tempo != 0);
label1.Text = "End";
}
Se richiami questa funzione il form si blocca (ad es non riesci a spostarlo col mouse) e la label verrà scritta solo alla fine, per cui non vedrai mai 'Start' ma solo 'End'.
Windows, e in genere tutti gli ambienti con interfaccia grafica sono 'Event driven', ad esempio la richiesta di scrittura di una label è per l' appunto una richiesta, non viene eseguita subito, ma dopo, in un apposito ciclo. Se scrivi un loop che dura un certo tempo blocchi il ciclo di gestione degli eventi.
Puoi 'usare Application.DoEvent' che permette al sistema operativo di eleborare gli eventi.
private void button1_Click(object sender, EventArgs e)
{
label1.Text = "Start";
int Tempo = 10;
Application.DoEvents();
do
{
Thread.Sleep(1000);
Tempo = Tempo - 1;
}
while (Tempo != 0);
label1.Text = "End";
}
Con questa versione, vedrai apparire 'Begin', ma poi il tuo form rimane bloccato (hai bucato la funzioe ma non il loop)
private void button1_Click(object sender, EventArgs e)
{
label1.Text = "Start";
int Tempo = 10;
do
{
Application.DoEvents();
Thread.Sleep(1000);
Tempo = Tempo - 1;
}
while (Tempo != 0);
label1.Text = "End";
}
Con questa invece riesci a muovere il form, anche se a scatti di un secondo (hai bucato il loop ma lo sleep è lungo).
La tecnica giusta sarebbe quella di usare un Timer (System.Windows.Forms.Timer).