10 votes

Quelle est la meilleure façon de faire en sorte qu'un thread signale un autre thread en .NET ?

J'ai besoin qu'un thread signale à un autre si l'utilisateur souhaite interrompre l'exécution, mais je ne sais pas comment mettre en œuvre le mécanisme de signalisation et de vérification des signaux. Je ne voudrais pas avoir un singleton dans mon projet (comme un global bool ), mais existe-t-il une alternative ?

En ce fil Les gens suggèrent des structures appropriées pour cela en C++, mais je ne connais rien de semblable en .NET. Quelqu'un pourrait-il m'éclairer ?

7voto

Matt Howells Points 20751

Essayer Travailleur d'arrière-plan . Il prend en charge les mises à jour de la progression et l'annulation d'une tâche en cours.

Si vous voulez qu'un thread attende qu'un autre thread ait fini de faire son travail, alors Monitor.Wait et Monitor.Pulse sont bons, tout comme ManualResetEvent. Cependant, ils ne sont pas vraiment utiles pour annuler une tâche en cours.

Si vous voulez écrire votre propre code d'annulation, vous pourriez simplement avoir un champ quelque part auquel les deux threads ont accès. Marquez-le comme volatile, par exemple :

private volatile bool cancelling;

Faites en sorte que le fil principal le mette à true, et que le fil de travail le vérifie périodiquement et le mette à false quand il a terminé.

Ce n'est pas vraiment comparable au fait d'avoir une "variable globale", car vous pouvez toujours limiter la portée de la variable sémaphore pour qu'elle soit privée à une classe.

5voto

Statement Points 1043

Un peu vague (manque de temps), mais regardez dans ManualResetEvent et AutoResetEvent . Vous pouvez également rechercher le mot-clé Monitor et lock.

3voto

torial Points 9883

Regardez dans Monitor.Wait et Monitor.Pulse. Voici un excellent article sur le Threading en .Net (très lisible) : http:/

1voto

Mark Cidade Points 53945

Une solution simple, telle qu'un booléen statique synchronisé, devrait suffire, contrairement à une solution basée sur un framework, qui pourrait être excessive pour votre scénario. Si vous souhaitez toujours utiliser un framework, jetez un coup d'œil à l'application extensions parallèles à .NET pour des idées.

1voto

Dror Helper Points 15499

Cela dépend du type de synchronisation dont vous avez besoin. Si vous voulez être capable de faire tourner un thread en boucle jusqu'à ce qu'une fin d'exécution soit atteinte, tout ce dont vous avez besoin est une variable bool statique. Si vous voulez qu'un thread attende qu'un autre thread atteigne un point d'exécution, vous pouvez utiliser des WaitEvents (AutoResetEvent ou ManualResetEvent). Si vous devez attendre plusieurs waitHandles, vous pouvez utiliser WaitHandle.WaitAll ou WaitHandle.WaitAny.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X