2010-08-31 10 views
7

Thread.Join ci restituisce se il thread è stato completato. Lo stesso possiamo determinare usando ThreadState. Allora qual è la differenza tra Thread.Join() e Thread.ThreadState?Thread.Join vs Thread.State

Possiamo usarli in modo intercambiabile?

+2

while (t.ThreadState! = ThreadState.Stopped) HaltAndCatchFire(); –

risposta

14

La differenza tra Join e guardando ThreadState manualmente è che Join è un'operazione di blocco. La funzione non ritorna fino al raggiungimento del timeout o il target Thread viene completato. Controllare lo ThreadState è più di un'operazione di sbirciare.

+0

Correggetemi se ho torto, ma ThreadState non è affidabile? – Josh

+2

Ahh ... da * MSDN: esistono due enumerazioni dello stato dei thread, System.Threading.ThreadState e System.Diagnostics.ThreadState. Le enumerazioni dello stato dei thread interessano solo alcuni scenari di debug. Il tuo codice non dovrebbe mai utilizzare lo stato del thread per sincronizzare le attività dei thread. * http://msdn.microsoft.com/en-us/library/system.threading.threadstate.aspx – Josh

+2

@Josh entrambi sono inattendibili nel senso che fornire solo informazioni sul passato :) – JaredPar

6

Thread.join WAIT per il thread da completare. ThreadState ti dà solo un'istantanea del thread e ritorna senza aspettare. C'è anche una variante di Thread.join che richiede un tempo di attesa. ThreadState e Join sono estremamente diversi e non credo che entrambi possano essere usati in modo intercambiabile.

Provare a eseguire un test in cui si effettuano entrambe le chiamate su un thread che ha un ciclo infinito.

3

Quando si chiama Thread.Join() blocca il thread chiamante fino a quando il thread che ha il metodo Join è completato. Se viene interrotto o completato correttamente, Join() che segue non bloccherà il thread chiamante. Ciò consente di avere 10 thread di lavoro e un thread principale che l'operazione deve essere eseguita dopo aver completato tutti e 10 i thread. Quindi puoi chiamare Join() sul primo thread. Quella chiamata bloccherà il thread principale fino al completamento del primo thread di lavoro. Dopodiché puoi chiamare Join() sul secondo thread e così via fino ad arrivare al thread # 10. Quando si chiama Join() su di esso, e il thread principale viene ripreso, si può essere sicuri che tutti i 10 thread completati e il thread principale possano riprendere il suo funzionamento.

Ad esempio:

Thread workers[] = new Thread[10]; 

//*** create and start threads *** 

foreach(Thread worker in workers) 
{ 
    worker.Join(); 
} 

//All threads are completed, now this operation can continue... 

D'altra parte, Thread.ThreadState restituisce solo il thread status (Aborted, Correre, ...) senza alterare lo stato del thread chiamante (non come Join, che mette il thread chiamante in WaitSleepJoin stato). Quindi questo è per uso solo se vuoi controllare cosa sta succedendo con thread in modo da poter prendere una certa azione, o vuoi implementare il tuo meccanismo Join, e così via ...

0

Thread.Join bloccherà la chiamata thread

Problemi correlati