Garder les valeurs booléennes synchronisées entre deux threads

Dans un thread (thread2) j’ai changé une valeur par exemple

CheckSuccess = false; 

Maintenant le thread principal (thread1 – GUI / Form) ne récupère pas le changement, comment serait-il possible de “propager” les changements autour de tous les threads?

J’avais l’impression que les threads devaient manipuler les données et non travailler sur des instances distinctes (sauf indication contraire)

Cela ressemble à une condition de course . Pour éviter cela, vous devez synchroniser un access aux variables partagées.

  • Si CheckSuccess est un champ, essayez de le marquer avec un mot clé volatile .
  • Si CheckSuccess est une propriété (qui sera traduite en appel de méthode), vous pouvez utiliser l’ instruction lock () :

     private static readonly object stateLock = new object(); lock (stateLock) { // access a shared variable here CheckSuccess = false; } 
  • Si CheckSuccess est une propriété du contrôle d’interface utilisateur et que vous souhaitez le modifier à partir d’un thread de travail. Vous devez utiliser des techniques spéciales pour transférer les modifications d’un opérateur vers le thread d’interface utilisateur. Cela dépend de la structure sur laquelle vous utilisez WinForms de WPF.

    • WinForms – Comment mettre à jour l’interface graphique à partir d’un autre thread en C #?
    • WPF – Mise à jour des contrôles WPF au moment de l’exécution

PS: De même, si plusieurs threads lisent une valeur et que peu de threads écrivent (en général, ils lisent plus souvent que d’écrire), vous pouvez trouver utile ReaderWriterLock.

J’utilise normalement des méthodes nestedes telles que Exchange . C’est beaucoup plus simple que d’utiliser un object verrouillable et il est garanti d’être atomique.

Il s’agit très probablement d’optimisations du compilateur entraînant la mise en cache de la valeur booléenne dans un registre de CPU. Le déclarer volatile devrait résoudre votre problème.