Langue

ResourceLockAttribute Classe

Définition

Déclare qu’une classe de test ou de test est prise en charge sur une ressource partagée nommée, de sorte que le planificateur parallèle dans l’assembly le sérialise uniquement par rapport aux autres tests qui déclarent la même ressource, au lieu de forcer des classes entières ou des assemblys à refuser la parallélisation avec DoNotParallelizeAttribute.

[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Method, AllowMultiple=true, Inherited=true)]
[System.Runtime.CompilerServices.Nullable(0)]
public sealed class ResourceLockAttribute : Attribute
[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Method, AllowMultiple=true, Inherited=true)]
public sealed class ResourceLockAttribute : Attribute
[<System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Method, AllowMultiple=true, Inherited=true)>]
[<System.Runtime.CompilerServices.Nullable(0)>]
type ResourceLockAttribute = class
    inherit Attribute
[<System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Method, AllowMultiple=true, Inherited=true)>]
type ResourceLockAttribute = class
    inherit Attribute
Public NotInheritable Class ResourceLockAttribute
Inherits Attribute
Héritage
ResourceLockAttribute
Attributs

Remarques

La ressource est identifiée par une clé de chaîne opaque de forme libre. Deux verrous font référence à la même ressource si et uniquement si leurs Resource chaînes sont égales à l’aide d’une comparaison ordinale et sensible à la casse. Les clés sont des identificateurs, et non des chemins d’accès : aucune relation hiérarchique n’est déduite entre elles (par exemple C:\out , et C:\out\sub n’est pas liée aux clés). Préférez les const champs et WellKnownResources les littéraux de chaîne inline afin qu’une faute de frappe devienne une erreur de compilation plutôt qu’une course silencieuse.

L’étendue de verrouillage est le processus hôte de test actuel uniquement. Cet attribut ne coordonne pas entre les processus ou les machines, de sorte qu’il ne rend pas les appels parallèles dotnet test mutuellement exclusifs.

Un verrou est acquis avant le démarrage de son bloc de planification et libéré une fois le bloc terminé, de sorte que le bloc - et non la méthode de test individuelle - détermine la durée pendant laquelle un verrou est conservé. Les formes d’un bloc dépendent des éléments Scopesuivants :

Sous ClassLevel (la valeur par défaut) le bloc est la classe entière. Par conséquent, un verrou au niveau de la classe est pris une fois et conservé sur chaque test de la classe, couvrant [ClassInitialize] et [ClassCleanup]. Les verrous du bloc sont l’union des clés déclarées de la classe et de chaque méthode, chacune mise à niveau vers le mode le plus fort déclaré n’importe où dans la classe. Dans cette étendue, la déclaration de verrous sur des méthodes individuelles ne rend pas le verrouillage plus granulaire.

Sous MethodLevel le segment est un test unique, un verrou de niveau classe est donc appliqué à chaque test individuellement et acquis et libéré par test. Les tests provenant d’autres classes peuvent donc être entrelacés entre deux tests de cette classe, et une ressource établie dans [ClassInitialize] n’est pas détenue en permanence par le biais [ClassCleanup]de .

Dans les deux cas, un verrou couvrant un test est conservé sur ce test [TestInitialize] et [TestCleanup]. Lorsqu’un bloc contient plusieurs verrous, les verrous sont acquis dans l’ordre de clé trié ordinal, ce qui rend impossible l’interblocage.

Si un test est également marqué DoNotParallelizeAttribute, cet attribut est prioritaire et les verrous de ressources déclarés n’ont aucun effet : ces tests s’exécutent dans la phase séquentielle et ne passent jamais par le planificateur parallèle qui acquiert des verrous.

Cet attribut est hérité : un verrou déclaré sur une classe de test de base s’applique à chaque classe dérivant de celle-ci, correspondant DoNotParallelizeAttribute. Il s’agit de la direction conservatrice - un dispositif de base qui touche une ressource partagée touche toujours celle-ci à partir de classes dérivées, et le sur-verrouillage s’exécute simplement plus lentement tandis que le sous-verrouillage produit des courses. Notez la conséquence : une classe dérivée ne peut pas supprimer un verrou hérité, ni affaiblir un verrou hérité ReadWriteRead. Par conséquent, sous ClassLevel un verrou sur une classe de base largement utilisée sérialise toute la hiérarchie. Déclarez des verrous sur le type le plus dérivé qui en a réellement besoin.

Constructeurs

Nom Description
ResourceLockAttribute(String)

Initialise une nouvelle instance de la ResourceLockAttribute classe pour la ressource spécifiée, à l’aide ReadWrite de l’accès.

Propriétés

Nom Description
Mode

Obtient ou définit le mode d’accès de la ressource. ReadWrite La valeur par défaut est (exclusive). Read Défini sur le moment où le test lit uniquement la ressource, afin qu’elle puisse s’exécuter simultanément avec d’autres lecteurs et blocs uniquement sur un enregistreur.

Resource

Obtient la clé opaque identifiant la ressource partagée. Comparé à l’aide d’une comparaison ordinale et sensible à la casse.

S’applique à