Język

ResourceLockAttribute Klasa

Definicja

Deklaruje, że klasę testową lub testową rywalizuje o nazwany zasób udostępniony, tak aby równoległy harmonogram w zestawie serializuje go tylko względem innych testów, które deklarują ten sam zasób, zamiast wymuszać użycie całych klas lub zestawów, aby zrezygnować z równoległości z 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
Dziedziczenie
ResourceLockAttribute
Atrybuty

Uwagi

Zasób jest identyfikowany przez dowolny, nieprzezroczystym kluczem ciągu. Dwa blokady odnoszą się do tego samego zasobu, jeśli i tylko wtedy, gdy ich Resource ciągi są równe przy użyciu porównania porządkowego, z uwzględnieniem wielkości liter. Klucze są identyfikatorami, a nie ścieżkami: żadna relacja hierarchiczna nie jest wnioskowana między nimi (na przykład C:\out i C:\out\sub nie są niepowiązanymi kluczami). Preferuj const pola i WellKnownResources nad literałami ciągu wbudowanego, aby literówka stała się błędem kompilacji, a nie cichym wyścigiem.

Zakres blokowania jest tylko bieżącym procesem hosta testowego. Ten atrybut nie koordynuje się między procesami ani maszynami, więc nie powoduje wzajemnie wykluczania równoległych dotnet test wywołań.

Blokada jest uzyskiwana przed rozpoczęciem i zwolnieniem fragmentu harmonogramu po zakończeniu fragmentu, więc fragment — a nie metoda testowa — określa, jak długo blokada jest przechowywana. To, co stanowi fragment, zależy od Scopeelementu :

W obszarze ClassLevel (wartość domyślna) fragment jest całą klasą, więc blokada na poziomie klasy jest wykonywana raz i przechowywana w każdym teście w klasie, obejmującej [ClassInitialize] i [ClassCleanup]. Blokady fragmentu są związkiem zadeklarowanych kluczy klasy i każdej metody, z których każda została uaktualniona do najmocniejszego trybu zadeklarowanego w dowolnym miejscu w klasie — więc w tym zakresie deklarowanie blokad na poszczególnych metodach nie sprawia, że blokowanie jest bardziej szczegółowe.

W ramach MethodLevel fragmentu jest jednym testem, więc blokada na poziomie klasy jest stosowana do każdego testu indywidualnie i nabyte i zwolnione na test. W związku z tym testy z innych klas mogą przeplatać się między dwoma testami tej klasy, a zasób ustanowiony w [ClassInitialize] obiekcie nie jest stale własnością klasy [ClassCleanup].

W obu przypadkach blokada obejmująca test jest utrzymywana w tych testach [TestInitialize] i [TestCleanup]. Gdy fragment przechowuje więcej niż jedną blokadę, blokady są pozyskiwane w porządkowej kolejności kluczy, co sprawia, że zakleszczenie jest niemożliwe.

Jeśli test jest również oznaczony DoNotParallelizeAttributejako , ten atrybut ma pierwszeństwo, a zadeklarowane blokady zasobów nie mają wpływu: takie testy są uruchamiane w fazie sekwencyjnej i nigdy nie przechodzą przez równoległy harmonogram, który uzyskuje blokady.

Ten atrybut jest dziedziczony: blokada zadeklarowana w klasie testowej podstawowej ma zastosowanie do każdej klasy pochodnej z niej, zgodnej DoNotParallelizeAttributez parametrem . Jest to konserwatywny kierunek - oprawa podstawowa, która dotyka współużytkowanego zasobu nadal dotyka go z klas pochodnych, a nadmierne blokowanie działa tylko wolniej, podczas gdy niedoblokowanie produkuje wyścigi. Zwróć uwagę na konsekwencję: klasa pochodna nie może usunąć dziedziczonej blokady ani osłabić dziedziczonego ReadWriteReadna , więc pod ClassLevel blokadą w szeroko używanej klasie bazowej serializuje całą hierarchię. Zadeklaruj blokady na najbardziej pochodnym typie, który faktycznie ich potrzebuje.

Konstruktory

Nazwa Opis
ResourceLockAttribute(String)

Inicjuje ResourceLockAttribute nowe wystąpienie klasy dla określonego zasobu przy użyciu ReadWrite dostępu.

Właściwości

Nazwa Opis
Mode

Pobiera lub ustawia tryb dostępu dla zasobu. Wartość domyślna to ReadWrite (wyłączność). Ustaw wartość na Read wartość , gdy test odczytuje tylko zasób, aby można było go uruchomić jednocześnie z innymi czytnikami i blokować tylko względem składnika zapisywania.

Resource

Pobiera nieprzezroczystym klucz identyfikujący udostępniony zasób. W porównaniu z porównaniem porządkowym, uwzględniającym wielkość liter.

Dotyczy