ResourceLockAttribute Klasse
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Deklariert, dass eine Test- oder Testklasse eine benannte freigegebene Ressource annimmt, sodass der parallele Planer in der Assembly nur gegen andere Tests serialisiert wird, die dieselbe Ressource deklarieren, anstatt ganze Klassen oder Assemblys zu erzwingen, die Parallelisierung zu deaktivieren.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
- Vererbung
-
ResourceLockAttribute
- Attribute
Hinweise
Die Ressource wird durch einen freiformigen, undurchsichtigen Zeichenfolgenschlüssel identifiziert. Zwei Sperren verweisen auf dieselbe Ressource, wenn und nur, wenn ihre Resource Zeichenfolgen mit einem Ordinalvergleich identisch sind. Schlüssel sind Bezeichner und keine Pfade: Es wird keine hierarchische Beziehung zwischen ihnen abgeleitet (z C:\out . B. und C:\out\sub nicht verknüpfte Schlüssel). Bevorzugen Sie const Felder und WellKnownResources über Inlinezeichenfolgenliterale, sodass ein Tippfehler zu einem Kompilierungsfehler und nicht zu einem unbeaufsichtigten Rennen wird.
Sperrbereich ist nur der aktuelle Testhostprozess. Dieses Attribut koordiniert nicht über Prozesse oder Computer hinweg, sodass parallele dotnet test Aufrufe sich gegenseitig ausschließen.
Eine Sperre wird erworben, bevor der Planungsblock beginnt und nach Abschluss des Blocks losgelassen wird, sodass der Block - nicht die einzelne Testmethode - bestimmt, wie lange eine Sperre gehalten wird. Welche Formen ein Block bildet, hängt von Scope:
Unter ClassLevel (Standard) ist der Block die gesamte Klasse, sodass eine Sperrung auf Klassenebene einmal durchgeführt wird und bei jedem Test in der Klasse, überspannt [ClassInitialize] und [ClassCleanup]gehalten wird. Die Sperren des Blocks sind die Vereinigung der deklarierten Schlüssel der Klasse und jeder Methode, die jeweils auf den stärksten Modus aktualisiert wurden, der an einer beliebigen Stelle in der Klasse deklariert wurde . Daher macht die Deklarierung von Sperren für einzelne Methoden unter diesem Bereich keine genauere Sperrung.
Unter MethodLevel dem Block handelt es sich um einen einzelnen Test, sodass eine Sperrung auf Klassenebene auf jeden Test einzeln angewendet und pro Test abgerufen und freigegeben wird. Tests aus anderen Klassen können sich daher zwischen zwei Tests dieser Klasse verzahnen, und eine ressource, die [ClassInitialize] in der Klasse aufgebaut ist, ist nicht kontinuierlich im [ClassCleanup]Besitz .
In beiden Fällen wird eine Sperre, die einen Test abdeckt, in den tests [TestInitialize] und [TestCleanup]. Wenn ein Block mehr als eine Sperre enthält, werden die Sperren in ordnungsgeordneter Schlüsselreihenfolge erworben, wodurch deadlock unmöglich wird.
Wenn ein Test auch markiert DoNotParallelizeAttributeist, hat dieses Attribut Vorrang, und die deklarierten Ressourcensperren haben keine Auswirkungen: Solche Tests werden in der sequenziellen Phase ausgeführt und durchlaufen niemals den parallelen Scheduler, der Sperren erwirbt.
Dieses Attribut wird geerbt: Eine für eine Basistestklasse deklarierte Sperre gilt für jede von ihr abgeleitete Klasse, die übereinstimmend DoNotParallelizeAttributeist. Dies ist die konservative Richtung - eine Basiseinrichtung, die eine gemeinsam genutzte Ressource berührt, berührt sie immer noch von abgeleiteten Klassen, und die Übersperrung läuft nur langsamer, während die Untersperrung Rennen erzeugt. Beachten Sie die Folge: Eine abgeleitete Klasse kann keine geerbte Sperre entfernen oder eine geerbte ReadWriteReadzu schwächen, daher serialisiert unter ClassLevel einer Sperre für eine weitverwendete Basisklasse die gesamte Hierarchie. Deklarieren Sie Sperren für den abgeleitetsten Typ, der sie tatsächlich benötigt.
Konstruktoren
| Name | Beschreibung |
|---|---|
| ResourceLockAttribute(String) |
Initialisiert eine neue Instanz der ResourceLockAttribute Klasse für die angegebene Ressource unter Verwendung ReadWrite des Zugriffs. |
Eigenschaften
| Name | Beschreibung |
|---|---|
| Mode |
Dient zum Abrufen oder Festlegen des Zugriffsmodus für die Ressource. Standardwert ist ReadWrite (exklusiv). Legen Sie fest, Read wann der Test nur die Ressource liest, sodass sie gleichzeitig mit anderen Lesern ausgeführt werden kann und nur für einen Writer gilt. |
| Resource |
Ruft den undurchsichtigen Schlüssel ab, der die freigegebene Ressource identifiziert. Verglichen mit einem Ordinalvergleich bei Groß-/Kleinschreibung. |