Quel est le meilleur moyen de faire en sorte qu'un thread signale un autre thread dans .NET?

StackOverflow https://stackoverflow.com/questions/115928

  •  02-07-2019
  •  | 
  •  

Question

Je dois faire en sorte qu'un thread en signale un autre si l'utilisateur souhaite interrompre l'exécution. Toutefois, je ne sais pas comment mettre en œuvre le mécanisme de signalisation / contrôle du signal. Je ne voudrais pas avoir un singleton dans mon projet (comme un bool global), mais existe-t-il une alternative?

Dans ce fil

Était-ce utile?

La solution

Essayez BackgroundWorker . Il prend en charge les mises à jour de progression et l'annulation d'une tâche en cours d'exécution.

Si vous voulez qu'un thread attende qu'un autre thread ait fini de le faire, alors Monitor.Wait et Monitor.Pulse sont corrects, de même que ManualResetEvent. Cependant, ils ne sont pas vraiment utiles pour annuler une tâche en cours d'exécution.

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

private volatile bool cancelling;

Demandez au thread principal de le définir sur true, puis vérifiez-le périodiquement, puis définissez-le sur false à la fin du processus.

Cela n’est pas vraiment comparable à une "variable globale", car vous pouvez toujours limiter la portée de la variable sémaphore à une classe.

Autres conseils

Un peu vague (peu de temps), mais regardez dans ManualResetEvent et AutoResetEvent . Vous pouvez également consulter le mot clé Surveiller et verrouiller.

Regardez dans Monitor.Wait et Monitor.Pulse. Voici un excellent article sur le filetage en .Net (très lisible): http: //www.albahari .com / threading / part4.aspx

Une solution simple, comme un booléen statique synchronisé, devrait suffire, contrairement à une solution basée sur un framework qui peut être surexploitée pour votre scénario. Si vous souhaitez toujours un cadre, consultez le parallèle. extensions à .NET pour des idées.

Cela dépend du type de synchronisation dont vous avez besoin. Si vous voulez pouvoir exécuter le thread dans une boucle jusqu'à ce que la fin de l'exécution soit atteinte, vous n'avez besoin que d'une variable statique bool. Si vous voulez qu'un thread attende qu'un autre thread atteigne un point d'exécution, vous pouvez utiliser WaitEvents (AutoResetEvent ou ManualResetEvent). Si vous devez attendre plusieurs waitHandles, vous pouvez utiliser WaitHandle.WaitAll ou WaitHandle.WaitAny.

Regardez l'espace de noms System.Runtime.Remoting.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top