2010-05-19 12 views
5

In un modulo (F1) ho un pulsante, da cui se creo un'altra forma (consente di chiamare F2) e vederlo non c'è nessun problemaWinForms congela

ma mi piacerebbe fare qualcosa di simile

Alcuni thread nella mia app eseguono una connessione e ascoltano i messaggi da un server. quando arriva un messaggio, il mio modulo principale è registrato per ottenere un evento che esegue una funzione. Da quella funzione sto provando a creare e mostrare il modulo di tipo F2 (vuoto, non modificato in esso): lo mostra ma poi congela la mia applicazione.

più precisamente:

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

hai provato a catturare quelle linee che pensi causi il blocco? – Terry

+0

C# non ha forme. –

+0

il blocco si verifica dopo f2.Show(). non ci sono errori, nessuna eccezione in corso. la mia ipotesi è che il problema potrebbe essere perché il modulo è praticamente avviato da un altro thread –

risposta

7

Penso che il motivo è che si sta eseguendo le operazioni di filettatura croce. È necessario inserire la creazione del modulo sul thread dell'interfaccia utente prima di creare form2. Credo che in seguito vi aiuterà 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

penso che ci sia un problema con "this.BeginInvoke (new ShowForm (new object [] {sender, e}))"; linea. si dice "errore CS0149: nome metodo previsto" –

+0

@andrew - verifica ora, ho dimenticato di inserire il nome del target :). – Ram

2

utilizzando il codice di Ram ho finalmente avuto modo di questo e funziona

Grazie!

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