2011-01-12 3 views
6

Quindi ho un thread nella mia applicazione, che ha lo scopo di ascoltare i messaggi dal server e agire in base a ciò che riceve.Nuovo modulo su un thread diverso

Mi sono imbattuto in un problema quando volevo sparare un messaggio dal server, che quando l'app client lo riceve, l'app client aprirà un nuovo modulo. Tuttavia questa nuova forma si blocca immediatamente.

Penso che quello che sta succedendo è che il nuovo modulo viene caricato sullo stesso thread del thread che ascolta il server, che ovviamente è occupato ad ascoltare sul flusso, a sua volta bloccando il thread.

Normalmente, per le altre mie funzioni nel thread di ascolto dei client, utilizzerei i richiami per aggiornare l'interfaccia utente del modulo principale, quindi suppongo che quello che chiedo sia se è un modo per richiamare un nuovo modulo su la forma principale

risposta

15

Presumo che si tratti di Windows Form e non di WPF? Dal tuo thread in background, non dovresti tentare di creare alcun modulo, controllo, ecc. O manipolarli. Funziona solo dal thread principale che ha un ciclo di messaggi in esecuzione e può elaborare messaggi di Windows.

Quindi, per ottenere il codice da eseguire sul thread principale al posto del thread in background, è possibile utilizzare il metodo Control.BeginInvoke in questo modo:

private static Form MainForm; // set this to your main form 

private void SomethingOnBackgroundThread() { 

    string someData = "some data"; 

    MainForm.BeginInvoke((Action)delegate { 

     var form = new MyForm(); 
     form.Text = someData; 
     form.Show(); 

    }); 
} 

La cosa principale da tenere a mente è che se la thread in background non ha bisogno di alcuna risposta dal thread principale, dovresti usare BeginInvoke, non Invoke. Altrimenti si potrebbe entrare in un deadlock se il thread principale è occupato in attesa sul thread in background.

0

Fondamentalmente avete dato la risposta da soli - basta eseguire il codice per creare il modulo sul thread della GUI, utilizzando Invoke.