2010-05-14 5 views

risposta

2

Bene, si può test Thread.IsAlive - ma che non sarà aggiornato non appena lo si è verificato, naturalmente. È possibile mantenere un elenco di thread "attualmente in vita" e rimuoverli uno alla volta quando si fermano, dormendo tra le esecuzioni di test. Per informazioni più dettagliate è possibile utilizzare Thread.ThreadState.

Qual è l'immagine più grande qui? Cosa stai cercando di ottenere e perché non vuoi chiamare Thread.Join (potenzialmente con un timeout)?

4

Se si utilizza .NET 4, è possibile utilizzare il metodo Task Parallel Library e ContinueWhenAll.

Dovresti modificare i tuoi thread per essere rappresentati come Task. Le attività sono più facili da utilizzare con i thread. Di solito non devi preoccuparti di cose di livello inferiore come sei costretto a fare ora come la pianificazione o l'attesa per completare le cose.

-1

A che scopo? Diagnostica? Console.WriteLine.

In caso contrario, utilizzare una variabile globale (come in: accessibile a tutti i thread), incrementarla quando inizia uno dei thread, diminuire quando finisce. Se 0, tutti i thread hanno completato il lavoro, ma è necessario fare attenzione a sincronizzarlo correttamente altrimenti si otterranno falsi positivi. Dopo aver avviato le discussioni si fa un:

while (runningThreadsCount > 0) 
{ 
    // There are still working threads 
} 
+0

Grazie a tutti per il vostro aiuto. Ho usato Threadcount e ho risolto il mio problema. Ho usato do while loop: do { Console.WriteLine ("Numero di thread: {0}", ImageCompute.threadCount); } while (! (ImageCompute.threadCount == 0)); ma, questo è come contare il numero di thread. Ma abbiamo qualcosa come le funzioni di callback. Delega che possiamo allegare a ogni thread e trigger una volta completata. Grazie ancora. – Harsha

+0

Questo approccio è soggetto a condizioni di competizione perché l'incremento e il decremento di un intero non è un'operazione atomica (implica una lettura e una scrittura). Due thread potrebbero leggere lo stesso valore, decrementarlo e riscriverlo, causando che runThreadsCount non diventi mai 0. –

+0

@Harsha Se vuoi fare cose come continuare il lavoro quando i thread sono finiti, dai un'occhiata alla Libreria parallela Task (controlla la mia risposta). –

0

Che dire MyThread.ThreadState == System.Threading.ThreadState.Stopped?

+0

Dovrebbe essere '(MyThread.ThreadState & System.Threading.ThreadState.Stopped) == System.Threading.ThreadState.Stopped' poiché 'ThreadState' ha il flag FlagsAttrbiute e quindi può" contenere "più valori. – Patrick

0

È possibile utilizzare la classe ThreadPool anziché un array e utilizzare il metodo "GetAvailableThreads" per verificare se tutti i thread sono disponibili. Vedi:

ThreadPool class.

0

Avere i fili richiamano alla classe che li hai iniziato a segnalare che sono fatte