2010-04-27 11 views
1

Comme nous savons que chaque minuterie écoulée méthode rappels sur un thread séparé. Y a-t-il un moyen d'annuler le thread minuteur dans C#? Supposons qu'un thread de minuteur soit bloqué lors d'une opération longue. Comment un nouveau thread abandonnerait-il le thread bloqué? Thread.CurrentThread pointe sur le thread appelant au lieu du thread bloqué.abandonner les threads minuterie

+0

Langue? Plate-forme? –

+1

On dirait l'anglais pour moi. – MusiGenesis

+0

Tous les rappels de minuterie ne se déclenchent pas sur des threads séparés. Quelle minuterie utilisez-vous? –

Répondre

0

L'annulation de threads entraîne une exception asynchrone. La meilleure façon d'annuler les threads est donc de ne pas avorter du tout. Au lieu de cela, utilisez mutex et sémaphores pour signaler l'annulation, puis interrogez continuellement l'état d'annulation. si l'annulation est signalée ne rien faire.

1

Il me semble que la façon la plus simple est de stocker l'objet de fil avant que le thread de minuterie effectue des travaux avec le code comme ceci:

timerThread = System.Threading.Thread.CurrentThread; 

Puis, quand vous devez l'annuler, appelez

timerThread.Abort(); 

Modifier: Par commentaires, je dirai que l'abandon de threads n'est pas une bonne idée. Il est préférable de les faire se terminer gracieusement. Je suggère d'envoyer une sorte de message au thread, peut-être en définissant simplement un drapeau, et en faisant en sorte que le thread se termine quand il trouve ce message.

+0

Ce n'est vraiment pas une bonne idée. Cela déclenchera une exception ThreadAbortException dans le thread qui peut ou non être préparé pour le gérer. Encore pire si le thread finit par être un thread ThreadPool. – Aaronaught

+0

Bien, abandonner les discussions n'est pas une bonne idée, mais c'était la question. – BlueMonkMN

+0

Les minuteries System.Threading utilisent ThreadPool et les threads de réutilisation ThreadPool en tuer un sous ses pieds n'est jamais une bonne idée. –

4

Implémentez votre minuteur en tant que BackgroundWorker avec WorkerSupportsCancellation et vérifiez si vous avez sélectionné CancelPending dans votre minuteur écrit manuellement?

+0

Je crois que même si vous annulez le thread worker de fond. il continue à traiter le travail en arrière-plan. – TrustyCoder

+0

Il peut continuer le traitement. C'est à vous de vérifier pour CancellationPending dans la méthode DoWork de votre BackgroundWorker et d'arrêter si cela est vrai. –

+0

Uh. Oui. Je n'avais pas réalisé que je devais le dire explicitement. BackgroundWorker est essentiellement un objet Thread avec deux avantages: - il vous permet de demander une annulation (externe) et de vérifier si une annulation a été demandée (en interne) afin que vous puissiez avoir une sortie propre - capturez l'événement de terminaison de thread –