2010-05-19 15 views
5

En un formulario (F1) tengo un botón, de la que si creo otra forma (llamémosle F2) y demostrar que no hay problemaWinForms congela

pero me gustaría hacer algo como esto

Un hilo en mi aplicación está ejecutando una conexión y escucha mensajes de un servidor. cuando llega un mensaje, mi formulario principal se registra para obtener un evento que ejecuta una función. A partir de esa función, intento crear y mostrar el formulario tipo F2 (vacío, nada modificado en él): lo muestra pero luego congela mi aplicación.

más exactamente:

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(); 
    } 
} 
+0

¿Ha intentado capturar esas líneas que cree que causan la congelación? – Terry

+0

C# no tiene formularios. –

+0

la congelación ocurre después de f2.Show(). no hay ningún error, no hay excepciones. mi suposición es que el problema podría ser porque el formulario prácticamente se está iniciando desde otro hilo –

Respuesta

7

Creo que la razón es que esté realizando operaciones de hilo cruzado. Debe colocar la creación del formulario en el subproceso de interfaz de usuario antes de crear form2. Creo siguiente le ayudará a

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(); 
     } 
     } 
    } 
+0

Creo que hay un problema con "this.BeginInvoke (new ShowForm (new object [] {sender, e}));" línea. dice "error CS0149: nombre del método esperado" –

+0

@andrew - verifique ahora, se me olvidó poner el nombre de destino :). – Ram

2

utilizando el código de Ram Finalmente llegué a este y funciona

Gracias!

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(); 
     } 
    } 
} 
Cuestiones relacionadas