2010-01-26 8 views
1

Je crée un thread (un seul) pour faire un peu de travail et il se débrouille tout seul sans accéder aux données en dehors de la bande de roulement sauf appeler callback() pour voir si l'utilisateur veut quitter (envoie aussi un rapport d'état retour au fil principal à afficher dans l'interface graphique).Meilleur moyen de réveiller un fil pour quitter? C#

Lorsque la fermeture ferme l'exe je voudrais réveiller le fil et le faire quitter, quelle est la meilleure façon de le faire? Le rappel dit déjà si l'utilisateur veut quitter, maintenant le problème est d'utiliser Thread.Sleep et de le réveiller prématurément afin qu'il puisse quitter au lieu d'avoir le processus actif pendant quelques secondes ou minutes. Cette fonctionnalité serait bien pour arrêter de sortir plus rapidement.

Répondre

3

Une autre approche serait la suivante:

Avoir un ManualResetEvent dans votre programme et appelez Set lorsque vous voulez que le fil pour terminer et fermer. Au lieu d'appeler Thread.Sleep sur votre fil de travail, appelez event.WaitOne et passez un objet TimeSpan. Si l'événement est signalé, votre thread de travail se réveillera avant l'expiration du délai. WaitOne renverra true.

+0

Même avec cette solution, je recommanderais quand même d'utiliser un BackgroundWorker. –

2

Utilisez un BackgroundWorker ou définissez la propriété IsBackground de votre thread sur true, votre application ne restera donc pas ouverte.

Je recommanderais le BackgroundWorker, mais ce dernier est une solution rapide.

Mise à jour

Affiche originale a changé ses exigences après avoir affiché la question (voir les commentaires attachés à cette question). Mettre à jour pour répondre à:

Si vous souhaitez arrêter une opération en arrière-plan sans mettre fin à l'application, veuillez consulter la méthode CancelAsync du technicien d'arrière-plan. En outre, n'utilisez pas Thread.Sleep - utilisez un WaitHandle et appelez WaitOne sur ce que vous devez attendre.

+0

Je vais regarder, comment puis-je lui dire de se réveiller de son sommeil? -edit- je suppose que je pourrais l'utiliser pour ne pas empêcher la fin, mais je voudrais le réveiller lorsque l'utilisateur clique sur arrêter. Je suppose que je ne vais pas déranger? (Essayer de tuer le fil semble mauvais) –

+0

Vous ne devriez pas avoir besoin de faire quoi que ce soit dans le fil d'arrière-plan. À moins qu'il y ait un nettoyage spécifique dont votre thread a besoin avant que l'application ne se ferme, vous pouvez simplement fermer l'application et laisser le thread mourir. Les threads d'arrière-plan ne peuvent pas garder l'application ouverte. –

+0

J'étais plus préoccupé par permettre à l'utilisateur de l'arrêter tôt et commencer une commande différente sans attendre dans mon commentaire –

1

Je suis d'accord avec Mark. La seule chose claire à propos de votre question est que vous avez besoin de réexaminer votre stratégie de threading. Vous dites que vous avez un fil de travail, mais vous dites que vous voulez le réveiller?

Le fil est-il en attente de travail? Si c'est le cas, dormez en cycles plus courts et vérifiez la sortie plus souvent ou utilisez un événement de réinitialisation. La meilleure façon de réveiller un fil est de ne pas le mettre en veille. Fais ce que tu as à faire et sors. Toujours vérifier les signaux d'interruption, sous quelque forme que vous les implémenter, avant de commencer des opérations de longue durée, et encore, si vous devez dormir le fil, le faire dans des cycles courts.

Le thread est-il occupé et vous souhaitez l'interrompre? Vous n'avez peut-être pas d'autre choix que de le tuer si vous ne pouvez pas l'instrumenter de telle sorte qu'il puisse répondre aux signaux d'interruption en temps opportun.