2013-05-09 1 views
1

J'ai conçu un pour lequel seul l'objectif est d'exécuter une méthode. Il s'agit d'un formulaire please wait.Windows formes - attendre jusqu'à ce que le formulaire est complètement dessiné (peint)

Je lui donne un délégué et appelle le ShowDialog. Il prend juste ce délégué et l'exécute dans l'événement Shown. Après cela, Hide(). Le but est uniquement d'indiquer à l'utilisateur d'attendre que le délégué soit exécuté. MAIS: Il commence à exécuter le délégué AVANT qu'il soit complètement affiché. Je veux dire, le formulaire apparaît à l'écran, mais l'étiquette please wait est bloquée par le code courant, étant montré très tard, ou même pas montré. (Un rectangle vide reste au milieu du formulaire).

Je pourrais faire attendre deux secondes avant d'exécuter le délégué, mais y a-t-il un autre moyen (mieux et plus sûr) d'appeler le délégué APRÈS que le formulaire soit complètement peint, avec l'étiquette montrée ???

Merci.

+1

"le formulaire apparaît à l'écran, mais l'étiquette" please wait "est bloquée par le code en cours d'exécution, étant affichée très tard, ou même pas affichée (un rectangle vide reste au milieu du formulaire)." Il semble que vous ayez besoin d'exécuter le délégué dans un ** thread séparé ** afin que le formulaire puisse s'afficher et se mettre à jour correctement. –

+1

Appelez this.Update() avant d'exécuter le délégué. –

+0

@Idle_Mind, le thread séparé serait-il plus lent ??? C'est du code principal lourd. –

Répondre

1

Essayez d'utiliser un BackgroundWorker Le composant BackgroundWorker comporte 4 événements.

Vous avez besoin de mettre en œuvre deux d'entre eux: DoWork et RunWorkerCompleted

La méthode DoWork exécute dans un thread, et est où vous faites votre travail (ou dans votre cas, appelez votre délégué) Le RunWorkerCompleted est appelé Lorsque le travail est terminé, vous pouvez appeler votre méthode Hide() ici.

Si vous arrive de vouloir montrer les progrès, vous pouvez mettre en œuvre l'événement ProgressChanged, qui vous permet de passer en un pourcentage rempli et un objet (normalement je passe un message sur ce que je fais)

Ensuite, faites simplement votre dessin comme d'habitude, et appelez le worker RunWorkerAsync d'arrière-plan pour l'appeler.

public class Wait : Form 
{ 
    BackgroundWorker _bgWorker = new BackgroundWorker(); 
    public delegate void toExecuteDele(object args); 

    public toExecuteDele ToExecute; 

    public Wait() 
    { 
     InitializeComponent(); 
     _bgWorker.DoWork += new DoWorkEventHandler(DoWork) 
     _bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler (WorkDone); 
    } 

    public void Execute(object args) 
    { 
     // Display Stuff (label, start a progress bar pulsing, maybe enable disable stuff 
      DispalyStuff(" Plate Wait"); 
     _bgWorker.RunBackgroundAsync(args); 
    } 

    private void DoWork(object sender, DoWorkEventArgs e) 
    { 

     if(ToExecute != null) 
      ToExecute(e.Argument); 

    } 

    public void WorkDone(object sender, RunWorkerCompletedEventArgs e) 
    { 
     // Display an Error if there is an exception in the event args 
     Hide(); 
    } 
} 

Tout dans le DoWork se passe dans un autre thread, tout ce que vous faites dans le parcours thread d'interface utilisateur, et suspendre l'habitude pendant que l'exécution.

Questions connexes