2009-12-10 19 views
1

Je dois faire un peu de nettoyage dans mon gestionnaire OnClosing, ce qui donne l'impression que mon application est suspendue.C#: OnClosing prend du temps, comment puis-je afficher une boîte de dialogue avec une barre de progression?

Comment puis-je afficher un petit dialogue avec une barre de progression de style défilant afin que les utilisateurs sachent au moins qu'il fonctionne toujours?

Fondamentalement, je veux commencer la boîte de dialogue, procéder à toutes mes procédures d'arrêt et quand cela est fait, fermez la boîte de dialogue de progression.

+0

Y a-t-il une raison pour laquelle vous ne pouvez pas créer la boîte de dialogue comme première chose dans 'OnClosing'? –

+0

Je peux le faire, mais comment créer une boîte de dialogue affichant la barre de progression et mes opérations d'arrêt en même temps? – Pygmy

Répondre

0

Avez-vous essayé quelque chose comme:

private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
    { 
    using (Form2 myForm2 = new Form2()) 
    { 
     myForm2.Show(); 

     //Do your stuff here 

     myForm2.Close(); 
    } 
    } 
2

Il y a plusieurs façons d'y parvenir, mais on pourrait looké comme ceci:

protected override void OnClosing(CancelEventArgs e) 
{ 
    base.OnClosing(e); 

    Form dlg=null; 
    ThreadPool.QueueUserWorkItem(state => { 
     dlg = new ShuttingDownUI(); 
     dlg.ShowDialog(); 
    }); 

    // do hard work with saving and stuff 

    if (dlg != null) 
    { 
     dlg.BeginInvoke((Action) dlg.Close); 
    } 
} 

Dans la méthode OnClosing de votre formulaire, ouvrez un " l'arrêt de la boîte de dialogue "sur un thread distinct contenant un ProgressBar avec sa propriété Style définie sur Marquee. Ensuite, continuez et faites votre procédure de sauvegarde/fermeture, et quand vous avez terminé, fermez la boîte de dialogue "fermeture". L'important est que le formulaire avec le rectangle de sélection doit être sur un fil distinct de celui où le travail est en cours. Sinon, il ne s'anime pas et l'application apparaît toujours comme si elle ne répondait pas.

+0

+1 pour non-bloquant –

+0

+ BeginInvoke peut être raccourci en dlg.BeginInvoke ((Action) dlg.Close); –

+0

@Michael: merci, je n'y ai pas pensé. Édité. –