Dans ma candidature, j'ai un formulaire qui démarre le processus de synchronisation et pour le nombre de raisons, je souhaite autoriser une seule synchronisation à fonctionner à la fois. J'ai donc ajouté un champ statique bool à mon formulaire indiquant si la synchronisation est en cours et ajoute une serrure pour définir ce champ sur true si elle n'était pas déjà définie pour que le premier thread puisse démarrer la synchronisation, mais lorsqu'il exécute tout autre fil que va essayer de commencer à terminer.
Mon code est quelque chose comme ceci: p> Ceci fonctionne bien mais quand je gère l'analyse de code sur mon projet, je reçois Le message d'avertissement suivant: P> CA2002: Microsoft.Reliabilité: 'SynchronizationForm.synchronizationForm_shnogronizationForm_SHOWN (Objet, Eventargs)' verrouille sur une référence de type "Type". Remplacez ceci par un verrou contre un objet avec une identité forte. P>
BlockQuote> Quelqu'un peut-il m'expliquer ce qui ne va pas avec mon code et comment puis-je l'améliorer pour faire disparaître l'avertissement. Qu'est-ce que cela signifie que cet objet a une identité forte? P> p>
4 Réponses :
Qu'est-ce qui ne va pas, c'est que vous bloquez quelque chose de public ( ceci vous garantit que ce n'est que typeof (synchronisationform) code>) qui est accessible partout de votre code et si un autre thread se verrouille sur cette même chose que vous obtenez une impasse. En général, il est une bonne idée de verrouiller uniquement des objets statiques privés:
synchronisationform code> qui pourrait posséder la serrure. P> p>
C'est vrai, mais verrouillant des objets avec une "identité faible" est également invisible pour d'autres raisons.
Le problème est que le typeof (synchronisationform) n'est pas un objet de verrouillage privé, ce qui signifie que tout autre morceau de code pourrait l'utiliser pour verrouiller, ce qui pourrait entraîner une impasse. Par exemple, si un autre code a fait ceci:
var form = new SynchronizationForm(); lock(typeof(SynchronizationForm)) { form.SomeMethodThatCausesSynchronizationForm_ShownToBeCalled(); }
Le
system.type code> objet d'une classe peut être utilisé de manière commise comme une serrure d'exclusion mutuelle pour des méthodes statiques de la classe. P> blockQuote>
Source: http://msdn.microsoft. com / fr-nous / bibliothèque / AA664735 (vs.71) .aspx p>
Pour ajouter à la réponse de Doug, ce que vous avez ici est un mécanisme de verrouillage qui ne doit être utilisé que dans des méthodes statiques, utilisée dans une méthode d'instance. P>
Verrouillage sur système.Type n'est plus considéré comme une bonne pratique, pour les raisons données dans MSDN par le lien de la réponse de Doug. Idéalement, cette déclaration et l'exemple de code seraient supprimés de la spécification de langue C #.