ciao,
perche' non provi ad usare un Thread?
Ovvero fai partire l'operazione da 10sec con un processo (thread appunto) separato dalla form, in modo che l'utente vede la progress che avanza, ma intanto puo' interagire con il resto della form (magari al lancio del thread disabilita i pulsanti che possono farti far casino cn l'utente idiota che clicca "n volte" e fa casino lanciando "n thread").
Nel tuo caso io userei un codice tipo:
...
private void button1_Click(object sender, EventArgs e)
{
progressBar1.Maximum = 100000;
Thread t = new Thread(miafunzioneLunga);
t.Priority = ThreadPriority.Lowest;
t.Start();
}
private void miafunzioneLunga()
{
progressBar1.Value = 0;
for (int i = 0; i < 100000; i++)
{
progressBar1.Invoke(new MethodInvoker(
delegate()
{
progressBar1.Value = i;
}
));
}
}
....
praticamente al Thread gli dici di eseguire quella funzione e nella funzione gli dici alla progressbar di andare a modificarsi il valore con Invoke+Methoinvoker+AnonymousMethod , per evitare il problema di CrossThreading.
Lo so, il codice sembra incasinato ma se fai una form con dei controlli tipo TextBox e ci metti quel codice, vedi che non si blocca il funzionamento, e la progressbar lavora in background.
A proposito di BackGround, esiste un componente che ti aiuta in questo tipo di operazioni, il BackGroundWorker.Ti do il link di msdn, se vuoi usare quella strada (analoga alla mia):
http://msdn2.microsoft.com/it-it/library/8xs8549b(VS.80).aspx
ciao.
Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo