7
votes

C # Serrure et analyse de code AVERTISSEMENT CA2002

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: xxx

Ceci fonctionne bien mais quand je gère l'analyse de code sur mon projet, je reçois Le message d'avertissement suivant:

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.

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?


0 commentaires

4 Réponses :


9
votes

Qu'est-ce qui ne va pas, c'est que vous bloquez quelque chose de public ( typeof (synchronisationform) ) 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: xxx

ceci vous garantit que ce n'est que synchronisationform qui pourrait posséder la serrure.


1 commentaires

C'est vrai, mais verrouillant des objets avec une "identité faible" est également invisible pour d'autres raisons.




3
votes

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();
}


0 commentaires

2
votes

Le system.type 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.

Source: http://msdn.microsoft. com / fr-nous / bibliothèque / AA664735 (vs.71) .aspx

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.


1 commentaires

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 #.