J'ai le problème suivant:
Je veux vérifier (C #) si l’exécution d’un thread est terminée, c’est-à-dire si la méthode du thread a été renvoyée. Ce que je fais maintenant, c'est appeler Thread.Join(1)
, mais cela donne un délai de 1 ms. Est-il possible de vérifier simplement si un fil est terminé? L'inspection du Thread.ThreadState
semble trop lourde.
Utilisez le drapeau Thread.IsAlive
. C'est pour donner le statut du fil.
Vous pouvez déclencher un événement à partir de votre thread quand il se termine et vous y abonner.
Sinon, vous pouvez appeler Thread.Join()
sans aucun argument:
Bloque le thread appelant jusqu'à ce qu'un thread se termine, tout en continuant d'effectuer le pompage COM et SendMessage standard.
Thread.Join(1)
will:
Bloque le thread appelant jusqu'à ce qu'un thread se termine ou que le temps spécifié s'écoule, tout en continuant d'effectuer le pompage COM et SendMessage standard.
Dans ce cas, la durée spécifiée est de 1 milliseconde.
Pour un fil, vous avez la propriété myThread.IsAlive
. Il est faux si la méthode de thread est retournée ou si le thread a été abandonné.
Use Thread.Join(TimeSpan.Zero)
Il ne bloquera pas l'appelant et retournera une valeur indiquant si le thread a terminé son travail. À propos, c’est également le moyen standard de tester toutes les classes WaitHandle
.
Si vous ne voulez pas bloquer le thread en cours en attendant/en vérifiant que l'autre thread est en cours d'achèvement, vous pouvez Implémenter une méthode de rappel comme ceci.
Action onCompleted = () =>
{
//On complete action
};
var thread = new Thread(
() =>
{
try
{
// Do your work
}
finally
{
onCompleted();
}
});
thread.Start();
Si vous utilisez des contrôles qui ne prennent pas en charge les opérations inter-thread, vous devez appeler la méthode de rappel.
this.invoke(onCompleted);
Jetez un coup d’œil à BackgroundWorker Class , avec le OnRunWorkerCompleted vous pouvez le faire.
J'utilise intensivement IsAlive, à moins que je ne bloque l'exécution en cours (du thread appelant), auquel cas j'appelle simplement Join () sans paramètre. Sachez maintenant que IsAlive peut retourner false si le thread cible n'a pas encore démarré l'exécution pour une raison quelconque.
Carlos Merighe.
Cela dépend de la façon dont vous voulez l'utiliser. Utiliser une jointure est un moyen. Une autre façon de le faire est de laisser le thread informer l'appelant du thread en utilisant un événement. Par exemple, lorsque vous avez votre thread d'interface utilisateur graphique qui appelle un processus qui s'exécute pendant un certain temps et qui doit mettre à jour l'interface graphique à la fin, vous pouvez utiliser l'événement pour le faire. Ce site Web vous donne une idée de la façon de travailler avec des événements:
http://msdn.Microsoft.com/en-us/library/aa645739%28VS.71%29.aspx
N'oubliez pas que cela entraînera des opérations inter-threads et si vous souhaitez mettre à jour l'interface graphique à partir d'un autre thread, vous devrez utiliser la méthode Invoke
du contrôle à mettre à jour.