2008-08-09 14 views
8

ho qualche codice per iniziare una discussione su .NET CF 2.0:Come attendere il completamento del thread prima di continuare?

ThreadStart tStart = new ThreadStart(MyMethod); 
Thread t = new Thread(tStart); 
t.Start(); 

Se chiamo questo all'interno di un ciclo completo delle voci fuori uso. Come introdurre un'attesa dopo lo t.Start(), in modo che il lavoro sul thread venga completato prima che il codice continui? BeginInvoke/EndInvoke sarà un'opzione migliore per questo rispetto alla creazione manuale di thread?

risposta

9

Quanto ordine avete bisogno di imporre i fili? Se hai solo bisogno che tutto il lavoro iniziato nel ciclo finisca prima che il codice continui, ma non ti interessa l'ordine in cui termina il lavoro all'interno del ciclo, chiamare Join è la risposta. Per aggiungere ulteriori dettagli a Kevin Kenny's answer,, è necessario chiamare Join all'esterno del ciclo. Questo significa che sarà necessario un insieme di tenere i riferimenti ai fili iniziare:

// Start all of the threads. 
List<Thread> startedThreads = new List<Thread>(); 
foreach (...) { 
    Thread thread = new Thread(new ThreadStart(MyMethod)); 
    thread.Start(); 
    startedThreads.Add(thread); 
} 

// Wait for all of the threads to finish. 
foreach (Thread thread in startedThreads) { 
    thread.Join(); 
} 

Al contrario, se si chiama Partecipa all'interno del ciclo, il risultato sarebbe fondamentalmente lo stesso che non utilizzando thread affatto. Ogni iterazione del corpo del loop creerebbe e avvierà una discussione, ma immediatamente la unirà e attenderà che finisca.

Se i singoli thread producono dei risultati (scrivere un messaggio in un registro, ad esempio), i messaggi potrebbero ancora apparire fuori ordine perché non c'è coordinamento tra i thread. È possibile ottenere i thread per produrre i risultati in ordine coordinandoli con un monitor.

2

Se sto leggendo questo correttamente, stai iniziando gli elementi di lavoro su un mucchio di thread ma sei preoccupato che i thread stanno completando fuori ordine, e, preferiresti aspettare fino a che ciascun thread non sia completato nell'ordine in cui essi sono stati avviati?

Se questo è il caso, non sono sicuro del motivo per cui si sta creando un thread per articolo di lavoro. Forse potresti espandere?

Se avete bisogno di aspettare per un thread per completare la si può solo fare:

t.Join(); 
4

Un altro modo di attendere la fine di un thread è l'utilizzo di AutoResetEvent.

private readonly AutoResetEvent mWaitForThread = new AutoResetEvent(false); 

private void Blah() 
{ 
    ThreadStart tStart = new ThreadStart(MyMethod); 
    Thread t = new Thread(tStart); 
    t.Start(); 

    //... (any other things) 
    mWaitForThread.WaitOne(); 
} 

private void MyMethod() 
{ 
    //... (execute any other action) 
    mWaitForThread.Set(); 
} 
Problemi correlati