2010-05-05 9 views
28

Ho seguente problema:Come controllare se Discussione terminato l'esecuzione

voglio controllare (C#) se un thread è terminato l'esecuzione, vale a dire se il metodo thread è tornato. Quello che faccio ora è chiamare Thread.Join(1), ma questo dà un ritardo di 1 ms. C'è un modo per controllare semplicemente se un thread è finito. Ispezionare Thread.ThreadState sembra troppo ingombrante.

risposta

7

È possibile attivare un evento dal thread al termine e iscriversi a tale evento.

In alternativa è possibile chiamare Thread.Join() senza argomenti:

Blocca il thread chiamante fino a quando non termina un thread, pur continuando a svolgere COM standard ed SendMessage pompaggio.

Thread.Join(1) volontà:

Blocca il thread chiamante fino a quando un filo termina o il tempo specificato, pur continuando a svolgere COM standard ed SendMessage pompaggio.

In questo caso il tempo specificato è 1 millisecondo.

+4

Prima di chiamare Thread.Join(), si dovrebbe sempre verificare che il thread corrente è diverso da quello a cui si sta partecipando. Altrimenti non tornerai più. –

+0

@Daniel - buon punto. – ChrisF

+0

@DanielRose Puoi dare un breve snippet su come verificare se sono diversi? Grazie. –

8

Per una discussione si ha la proprietà myThread.IsAlive. È falso se il metodo thread è ritornato o il thread è stato interrotto.

0

Dipende da come si desidera utilizzarlo. L'utilizzo di un join è a senso unico. Un altro modo per farlo è lasciare che il thread comunichi al chiamante del thread usando un evento. Ad esempio, quando hai la tua interfaccia grafica utente (GUI) che chiama un processo che gira per un po 'e deve aggiornare la GUI al termine, puoi usare l'evento per farlo. Questo sito vi dà un'idea di come lavorare con gli eventi:

http://msdn.microsoft.com/en-us/library/aa645739%28VS.71%29.aspx

Ricordate che si tradurrà in operazioni di cross-threading e nel caso in cui si desidera aggiornare la GUI da un altro thread, si dovrà utilizzare il metodo Invoke del controllo che si desidera aggiornare.

7

Perché non chiamare Thread.Join(TimeSpan.Zero)? Non bloccherà il chiamante e restituirà un valore che indica se il thread ha completato il suo lavoro. A proposito, questo è il modo standard per testare tutte le classi WaitHandle.

1

Uso IsAlive estesamente, a meno che non voglia bloccare l'esecuzione corrente (del thread chiamante), nel qual caso io chiamo Join() senza un parametro. Ora, tieni presente che IsAlive potrebbe restituire false se il thread di destinazione non ha ancora avviato l'esecuzione per nessuna ragione.

Carlos Merighe.

1

Dai uno sguardo allo BackgroundWorker Class, con lo OnRunWorkerCompleted puoi farlo.

+5

Le risposte solo link sono risposte sbagliate perché se il link cambia la tua risposta diventa inutile. Si prega di incorporare le informazioni rilevanti nella risposta e spiegare perché ciò che si sta suggerendo risponde alla domanda. – ChrisF

1

Se non si desidera bloccare il thread corrente attendendo/controllando l'altro completamento del thread in esecuzione, è possibile implementare il metodo di callback in questo modo.

Action onCompleted =() => 
{ 
    //On complete action 
}; 

var thread = new Thread(
() => 
    { 
    try 
    { 
     // Do your work 
    } 
    finally 
    { 
     onCompleted(); 
    } 
    }); 
thread.Start(); 

Se avete a che fare con i controlli che non supportano il funzionamento cross-thread, allora dovete richiamare il metodo di callback

this.invoke(onCompleted); 
+0

questo è fantastico. grazie. – Yohannes

+0

Puoi passare id al callback onCompleted()? – Mike