Ho creato una matrice di thread e li ho avviati tutti. Come sapere se tutti i thread hanno completato il lavoro. Non voglio usare thread.wait o thread.join.Rilevamento del completamento di una matrice di fili
risposta
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)?
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.
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
}
Che dire MyThread.ThreadState == System.Threading.ThreadState.Stopped?
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
È possibile utilizzare la classe ThreadPool anziché un array e utilizzare il metodo "GetAvailableThreads" per verificare se tutti i thread sono disponibili. Vedi:
Avere i fili richiamano alla classe che li hai iniziato a segnalare che sono fatte
se si vuole intercettare il lavoro in modo asincrono è possibile utilizzare BackgroundWorkers che hanno tutti un evento RunWorkerCompleted e un errore e proprietà annullati nel args evento
http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx
- 1. Fili di rubino con Watir
- 2. Rilevamento del tipo di faccia
- 3. Completamento asincrono Swift per restituire una matrice in classe personalizzata
- 4. Modifica del numero di fili in tensorflow su Cifar10
- 5. rilevamento riferimento in matrice da un'altra funzione
- 6. numero Primavera @Async limite di fili
- 7. Arresto regolare di fili e esecutore
- 8. radice quadrata di rilevamento del valore mobile
- 9. e fili esistenti?
- 10. Rilevamento del "rimbalzo" in basso di UITableView
- 11. Calcolo del bit di flag e rilevamento
- 12. Rilevamento di rinominazione Git del file vuoto
- 13. Completamento dell'interfaccia utente jQuery: attivazione di una ricerca dall'esterno del completamento automatico
- 14. INotifyPropertyChanged con fili
- 15. Rilevamento del blocco dell'applicazione
- 16. Rilevamento unidimensionale del bordo
- 17. Rilevamento del dispositivo di uscita in LaTeX
- 18. Codifica del filesystem di rilevamento PHP
- 19. Procedura di rilevamento del ciclo ricorsivo MySQL
- 20. Rilevamento del caricamento di un HttpModule
- 21. Fallimento dei nodi di rilevamento del quarzo
- 22. Rilevamento del tipo di interrupt iPhone
- 23. rilevamento del tempo di inattività utilizzando python
- 24. Rilevamento del lato superiore di un dado
- 25. Rilevamento del software AdBlocking?
- 26. Cometa e fili WCF
- 27. Fili con decoratori
- 28. Rilevamento del supporto del mouse
- 29. Netwire fili reciprocamente dipendenti
- 30. Rilevamento orientamento del dispositivo
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
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. –
@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). –