Le formulaire WinForms se bloque

Sur un formulaire (F1) j’ai un bouton, à partir duquel si je crée un autre formulaire (appelons-le F2) et le montre, il n’y a pas de problème

mais je voudrais faire quelque chose comme ça

Un fil de mon application exécute une connexion et écoute les messages d’un serveur. lorsqu’un message arrive, mon formulaire principal est enregistré pour obtenir un événement qui exécute une fonction. A partir de cette fonction, j’essaie de créer et d’afficher le formulaire de type F2 (vide, rien n’y est modifié): il le montre mais ensuite il gèle mon application.

plus exactement:

public partial class Form1 : Form { public Form1() { InitializeComponent(); ConnectionManagerThread.getResponseListener().MessageReceived += Form1_OnMessageReceived; } private void Form1_OnMessageReceived(object sender, MessageEventArgs e) { Form2 f2 = new Form2(); f2.Show(); } } 

Je pense que la raison est que vous effectuez des opérations croisées. Vous devez mettre la création du formulaire sur le thread d’interface utilisateur avant de créer form2. Je pense que la suite vous aidera

  public delegate void ShowForm(object sender, MessageEventArgs e); public partial class Form1 : Form { public Form1() { InitializeComponent(); ConnectionManagerThread.getResponseListener().MessageReceived += Form1_OnMessageReceived; } private void Form1_OnMessageReceived(object sender, MessageEventArgs e) { if (this.InvokeRequired) { this.BeginInvoke(new ShowForm((Form1_OnMessageReceived), new object[] { sender, e })); } else { Form2 f2 = new Form2(); f2.Show(); } } } 

en utilisant le code de Ram je suis finalement arrivé à cela et cela fonctionne

merci!

 public delegate void ShowForm(object sender, MessageEventArgs e); public partial class Form1 : Form { public Form1() { InitializeComponent(); ConnectionManagerThread.getResponseListener().MessageReceived += Form1_OnMessageReceived; } private void Form1_OnMessageReceived(object sender, MessageEventArgs e) { ShowForm2(sender, e); } private void ShowForm2(object sender, MessageEventArgs e) { if (this.InvokeRequired) { ShowForm f = new ShowForm(ShowForm2); this.Invoke(f, new object[] { sender, e }); } else { Form2 f2 = new Form2(); f2.Show(); } } }