2009-04-13 11 views
8

So che è possibile avviare un nuovo thread di lavoro con .NET. Ma come posso iniziare un nuovo thread UI (come in MFC)?Come avviare un thread dell'interfaccia utente in C#

Non mi importa se la soluzione è limitata solo alle finestre di Windows; Vorrei anche che la soluzione fosse puramente .NET - no p/invoca CreateThread, ecc.

Qualsiasi input apprezzato.

risposta

24

Utilizzare Application.Run - avvia un ciclo di messaggi nel thread corrente. Ci sono sovraccarichi per prendere un modulo per iniziare, o un contesto applicativo, o nessuno dei due. (Se si vuole fare questo per un nuovo filo , è necessario creare il filo e avviarlo nel modo normale, e renderlo chiamare Application.Run.)

+0

Come si Application.Run confronto con ShowDialog, che è l'approccio che ho usato prima? – supercat

+0

@supercat: stai chiamando 'ShowDialog' da un thread non UI? Non sono sicuro dell'effetto in quel caso. –

+1

Sì, sto chiamando ShowDialog da un thread non UI; l'effetto apparente è che la nuova finestra così creata avrà un thread UI indipendente dal thread dell'interfaccia utente di qualsiasi altra finestra. Sembra funzionare bene a condizione che la finestra non tenti di interagire con i controlli su altri thread e, a condizione che non tenti di impostare il suo MdiParent su una finestra in esecuzione su un altro thread. – supercat

2

Se stai cercando di creare un nuovo thread che è in grado di creare e gestire handle di Window, quindi è possibile utilizzare la funzione SetApartmentState sull'oggetto Thread e impostarla su STA. Probabilmente dovrai chiamare lo Application.Run all'interno del metodo per questo thread per creare il tuo loop di messaggi. Tuttavia, tieni presente che sei soggetto allo stesso thread-threading no-no che hai in qualsiasi altro thread (cioè, puoi solo interagire con l'handle per un controllo sul thread all'interno del quale è stato creato), quindi non puoi fare nulla sul tuo altro thread UI senza cambiare contesto.

4

Se si è interessati all'utilizzo di WPF, consultare l'articolo MSDN WPF's Threading Model, in particolare la sezione "Più finestre, più thread". Descrive in dettaglio cosa è necessario fare per creare un nuovo Dispatcher e mostrare una finestra su una nuova discussione.

+0

Ottimo articolo, grazie :) – Tom

0

Inoltre è possibile fare questo:

delegate void MyProcHandler(object param1, object param2); 

    MyForm.Invoke 
    (
      new MyProcHandler(delegate(object param1, object param2) 
      { 
      // some code 
      }), 
      null, 
      null 
    ); 
Problemi correlati