Domanda

Ho del codice per avviare un thread su .NET CF 2.0:

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

Se lo chiamo all'interno di un ciclo, gli articoli saranno completamente fuori servizio.Come introdurre un'attesa dopo 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 dei thread?

È stato utile?

Soluzione

Quanto ordine devi imporre ai thread?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, allora chiamare Join è la risposta.Per aggiungere ulteriori dettagli a La risposta di Kevin Kenny, dovresti chiamare Join al di fuori il cappio.Ciò significa che avrai bisogno di una raccolta per contenere i riferimenti ai thread che hai avviato:

// 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 chiamassi Join all'interno del ciclo, il risultato sarebbe sostanzialmente lo stesso di non utilizzare affatto i thread.Ogni iterazione del corpo del ciclo creerebbe e avvierebbe un thread, ma poi si unirebbe immediatamente ad esso e attenderebbe che finisca.

Se i singoli thread producono qualche risultato (ad esempio scrivere un messaggio in un registro), i messaggi potrebbero comunque apparire fuori ordine perché non c'è coordinamento tra i thread.È possibile fare in modo che i thread restituiscano i risultati in ordine coordinandoli con un Monitor.

Altri suggerimenti

Un altro modo per attendere la fine di un thread è utilizzare un file 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();
}

Se leggo correttamente, stai avviando elementi di lavoro su un gruppo di thread ma sei preoccupato che i thread vengano completati in modo non ordinato e preferiresti attendere fino al completamento di ciascun thread nell'ordine in cui sono stati avviati?

Se questo è il caso, non sono sicuro del motivo per cui stai creando un thread per elemento di lavoro.Forse potresti espanderti?

Se avessi bisogno di aspettare il completamento di un thread, potresti semplicemente fare:

t.Join();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top