ho chiesto a una serie di domande simili e ha ricevuto un sacco di buone risposte: Shutting down a multithreaded application
Nota: la mia domanda non ha richiesto un'uscita elegante, ma la gente ancora raccomandato che ho con grazia l'uscita dal ciclo di ogni filo.
La cosa più importante da ricordare è che se si vuole evitare di avere le discussioni che impediscono il processo di terminare è necessario impostare tutte le vostre discussioni a sfondo:
Thread thread = new Thread(new ThreadStart(testObject.RunLoop));
thread.IsBackground = true;
thread.start();
Il modo migliore per avviare e gestire thread è in a ThreadPool
, ma quasi tutti i contenitori là fuori possono essere utilizzati per mantenere un riferimento ai thread. I tuoi thread dovrebbero sempre avere un flag che indichi loro di terminare e dovrebbero controllarlo continuamente.
Inoltre, per un migliore controllo è possibile fornire le discussioni che con un CountdownLatch
: ogni volta che un filo sta uscendo proprio circuito segnalerà su un CountdownLatch
. Il thread principale chiamerà il metodo CountdownLatch.Wait()
e bloccherà fino a quando tutti i thread non avranno segnalato ... questo ti permetterà di pulire correttamente e assicurerà che tutti i tuoi thread si siano arrestati prima di iniziare a ripulire.
public class CountdownLatch
{
private int m_remain;
private EventWaitHandle m_event;
public CountdownLatch(int count)
{
Reset(count);
}
public void Reset(int count)
{
if (count < 0)
throw new ArgumentOutOfRangeException();
m_remain = count;
m_event = new ManualResetEvent(false);
if (m_remain == 0)
{
m_event.Set();
}
}
public void Signal()
{
// The last thread to signal also sets the event.
if (Interlocked.Decrement(ref m_remain) == 0)
m_event.Set();
}
public void Wait()
{
m_event.WaitOne();
}
}
E 'anche degno di ricordare che il metodo Thread.Abort() fa alcune cose strane:
Quando un thread chiama Interruzione su se stessa, l'effetto è simile a un'eccezione ; la ThreadAbortException si verifica immediatamente e il risultato è prevedibile. Tuttavia, se un thread chiama Abort su un altro thread, l'interruzione interrompe qualsiasi codice sia in esecuzione. C'è anche la possibilità che un costruttore statico possa essere interrotto. In casi rari, questo potrebbe impedire alle istanze di di quella classe di essere create nel dominio dell'applicazione. In le versioni .NET Framework 1.0 e 1.1, è possibile che il thread si interrompa mentre un blocco finally è in esecuzione, nel qual caso il blocco finally viene interrotto.
Il filo che chiama interruzione potrebbe blocco se il filo che viene interrotta è in una zona protetta di codice, ad esempio un blocco catch, infine blocco, o vincolata regione esecuzione . Se il thread che chiama Interrompi contiene un blocco che richiede il thread interrotto , si può verificare un deadlock.
Ho una domanda, sul Void ThreadEntry(), una volta creato un multiplo di thread nell'applicazione principale del punto di partenza del thread, possiamo lanciare qualsiasi altra applicazione su quel thread in base al numero di thread che hai assegnato. – shawn