3 votes

Comment afficher un formulaire à partir d'un autre fil de discussion

J'exécute ce code dans un thread séparé de mon application Winforms C# (le nom de mon formulaire est MainForm) :

DisplayDownload form2 = new DisplayDownload();

form2.TopMost = true;  
form2.Show();

Mais lorsque le fil est lancé, le formulaire ne s'ouvre jamais. Si je déplace le code sur le thread principal de mon application, il s'ouvre bien, mais si je le lance comme son propre thread, le formulaire ne s'ouvre jamais.

J'ai essayé d'utiliser la réponse acceptée de cet article : Appeler un formulaire Windows depuis un autre thread (.Net) mais je reçois cette erreur :

Impossible de convertir une méthode anonyme en type 'System.Delegate' car ce n'est pas un type de délégué.

Voici le code que j'essaie d'utiliser :

MainForm.Invoke(delegate {
         DisplayDownload form2 = new DisplayDownload();

         form2.TopMost = true; 
         form2.Show();
});

Quelqu'un peut-il me dire ce que je fais mal et comment le faire fonctionner ?

2voto

Jalal Aldeen Saa'd Points 9120

Ajouter new MethodInvoker(delegate() Donc :

MainForm.Invoke(new MethodInvoker(delegate() 
{
             DisplayDownload form2 = new DisplayDownload();

             form2.TopMost = true; 
             form2.Show();
}));

1voto

SLaks Points 391154

Vous devez explicitement instancier un type de délégué :

MainForm.Invoke(new Action(delegate { ... }));

C# 2 et les versions ultérieures peuvent convertir implicitement les groupes de méthodes en délégués, mais uniquement en un type de délégué spécifique.
Le site Invoke prend la méthode de base Delegate Il n'y a donc pas de type de délégué spécifique à créer par le compilateur.
Par conséquent, vous devez créer explicitement un délégué vous-même.

0voto

Ben Voigt Points 151460

Quel fil de discussion voulez-vous gérer les événements pour le nouveau formulaire ? Si vous voulez que le thread principal gère les événements, utilisez alors Control.Invoke comme le suggèrent les exemples existants.

Si vous voulez que le nouveau thread gère ses propres événements d'interface utilisateur, vous devez alors appeler Application.Run . Lorsque vous faites cela, le formulaire pourra se peindre lui-même et deviendra visible à l'écran.

0voto

Rakibul Points 71
    //This is for WPF Application 
     try
       {
        Application.Current.Dispatcher.Invoke(new Action(() => { 
         DisplayDownload form2 = new DisplayDownload();
         form2.TopMost = true; 
         form2.Show();
        }));
        }
        catch(Exception ex) {
         }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X