Question

J'ai du code pour démarrer un fil de discussion sur .NET CF 2.0 :

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

Si j'appelle cela dans une boucle, les éléments sont complètement hors service.Comment introduire une attente après t.Start(), afin que le travail sur le thread se termine avant que le code ne continue ?BeginInvoke/EndInvoke sera-t-il une meilleure option pour cela que la création manuelle de threads ?

Était-ce utile?

La solution

Quel ordre devez-vous imposer aux fils de discussion ?Si vous avez juste besoin que tout le travail commencé dans la boucle se termine avant que le code ne continue, mais que vous ne vous souciez pas de l'ordre dans lequel le travail dans la boucle se termine, alors appeler Join est la réponse.Pour ajouter plus de détails à La réponse de Kevin Kenny, tu devrais appeler Rejoindre dehors la boucle.Cela signifie que vous aurez besoin d'une collection pour contenir les références aux fils de discussion que vous avez démarrés :

// 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();
}

En revanche, si vous appeliez Join à l’intérieur de la boucle, le résultat serait fondamentalement le même que si vous n’utilisiez pas du tout de threads.Chaque itération du corps de la boucle créerait et démarrerait un thread, mais le rejoindrait immédiatement et attendrait qu'il se termine.

Si les threads individuels produisent un résultat (écrire un message dans un journal, par exemple), les messages peuvent toujours apparaître dans le désordre car il n'y a pas de coordination entre les threads.Il est possible d'obtenir que les threads affichent leurs résultats dans l'ordre en les coordonnant avec un moniteur.

Autres conseils

Une autre façon d'attendre la fin d'un thread consiste à utiliser un 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();
}

Si je lis ceci correctement, vous démarrez des éléments de travail sur un tas de threads, mais vous craignez que les threads se terminent dans le désordre et préféreriez attendre que chaque thread se termine dans l'ordre dans lequel il a été démarré ?

Si tel est le cas, je ne sais pas pourquoi vous créez un fil de discussion par élément de travail.Peut-être pourriez-vous développer ?

Si vous deviez attendre qu'un fil de discussion se termine, vous pouvez simplement faire :

t.Join();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top