Bon, tu declenches tes copies asynchrone, jusque la pas de probleme, c'est ce que tu fais depuis le debut, le fait de passer une methode de finalisation permet d'eviter le passage de la form dans la procedure de copie (elle n'a rien à faire la).
Un autre exemple serait peut etre plus parlant :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (numericUpDown1.Value != 0)
{
progressBar1.Step = 100 / (int)numericUpDown1.Value;
for (int i = 0; i < (int)numericUpDown1.Value; i++)
{
MethodInvoker inv = new MethodInvoker(new TaskClass().Run);
inv.BeginInvoke(IncrementProgress, null);
}
}
}
public void IncrementProgress(IAsyncResult e)
{
if (InvokeRequired)
{
this.Invoke(new AsyncCallback(IncrementProgress), e);
return;
}
progressBar1.PerformStep();
}
}
class TaskClass
{
static int s_i;
public void Run()
{
Trace.WriteLine("Job " + (++s_i).ToString() + "!");
Thread.Sleep(1000);
}
} |
Ici, j'ai une form avec un bouton, un numericupdown et une progressbar. En cliquant, je lance en parallele le nombre d'operation precisé dans le NUD, en placant le step de la progressbar comme il faut (si j'ai 8 operation je place un step de 100/8, etc ...). Je donne un callback de finalisation sur ma form, et je n'ai plus qu'à invoker ma form pour faire un performstep sur la progressbar.
L'avantage de cela est qu'à aucun moment ma procedure de traitement (Taskclass ici) n'a connu un element graphique, c'est la form qui lance les procedures, et donne la maniere de recuperer leurs finalisations, Taskclass fait juste son boulot, sans consideration pour l'affichage.
Pour note, si tu ne peux pas connaitre le nombre de job à l'avance (et donc tu ne peux pas donner une progression exacte dans ta progressbar), tu peux utiliser une progressbar en marquee (me souviens plus la propriété exacte ...).
Partager