Lenguaje

ResourceLockAttribute Clase

Definición

Declara que una clase de prueba o de prueba sostiene un recurso compartido con nombre, de modo que el programador paralelo en ensamblado la serializa solo en otras pruebas que declaran el mismo recurso, en lugar de forzar clases completas o ensamblados para no participar en la paralelización con 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
Herencia
ResourceLockAttribute
Atributos

Comentarios

El recurso se identifica mediante una clave de cadena opaca de forma libre. Dos bloqueos hacen referencia al mismo recurso si y solo si sus Resource cadenas son iguales mediante una comparación ordinal y con distinción entre mayúsculas y minúsculas. Las claves son identificadores, no rutas de acceso: no se deduce ninguna relación jerárquica entre ellas (por ejemplo C:\out , y C:\out\sub son claves no relacionadas). Prefiere const campos y WellKnownResources literales de cadena en línea para que un error tipográfico se convierta en un error de compilación en lugar de una carrera silenciosa.

El ámbito de bloqueo es solo el proceso de host de prueba actual. Este atributo no se coordina entre procesos o máquinas, por lo que no hace invocaciones paralelas dotnet test mutuamente excluyentes.

Se adquiere un bloqueo antes de que se inicie y libere su fragmento de programación después de que finalice el fragmento, por lo que el fragmento , no el método de prueba individual, determina cuánto tiempo se mantiene un bloqueo. Lo que forma un fragmento depende de Scope:

En ClassLevel (valor predeterminado), el fragmento es toda la clase, por lo que se toma un bloqueo de nivel de clase una vez y se mantiene en todas las pruebas de la clase, abarcando [ClassInitialize] y [ClassCleanup]. Los bloqueos del fragmento son la unión de las claves declaradas de la clase y de cada método, cada uno actualizado al modo más seguro declarado en cualquier parte de la clase, por lo que, en este ámbito, declarar bloqueos en métodos individuales no hace que el bloqueo sea más granular.

En MethodLevel el fragmento hay una sola prueba, por lo que se aplica un bloqueo de nivel de clase a cada prueba individualmente y se adquiere y libera por prueba. Por lo tanto, las pruebas de otras clases pueden intercalar entre dos pruebas de esta clase y un recurso establecido en [ClassInitialize] no pertenece continuamente a través [ClassCleanup]de .

En ambos casos, se mantiene un bloqueo que cubre una prueba en las pruebas y [TestInitialize][TestCleanup]. Cuando un fragmento contiene más de un bloqueo, los bloqueos se adquieren en orden ordinal-sorted key, lo que hace imposible el interbloqueo.

Si una prueba también está marcada DoNotParallelizeAttributecomo , ese atributo tiene prioridad y los bloqueos de recursos declarados no tienen ningún efecto: estas pruebas se ejecutan en la fase secuencial y nunca pasan por el programador paralelo que adquiere bloqueos.

Este atributo se hereda: un bloqueo declarado en una clase de prueba base se aplica a cada clase derivada de ella, que coincide con DoNotParallelizeAttribute. Esta es la dirección conservadora: un accesorio base que toca un recurso compartido sigue tocándolo de clases derivadas, y el sobrebloqueo simplemente se ejecuta más lento mientras que el bloqueo bajo produce carreras. Tenga en cuenta la consecuencia: una clase derivada no puede quitar un bloqueo heredado, ni debilitar un heredado ReadWrite a Read, por lo que bajo ClassLevel un bloqueo en una clase base ampliamente usada serializa toda la jerarquía. Declare bloqueos en el tipo más derivado que realmente los necesite.

Constructores

Nombre Description
ResourceLockAttribute(String)

Inicializa una nueva instancia de la ResourceLockAttribute clase para el recurso especificado mediante ReadWrite el acceso.

Propiedades

Nombre Description
Mode

Obtiene o establece el modo de acceso para el recurso. El valor predeterminado es ReadWrite (exclusivo). Read Establézcalo en cuando la prueba solo lee el recurso, de modo que pueda ejecutarse simultáneamente con otros lectores y bloquee solo en un escritor.

Resource

Obtiene la clave opaca que identifica el recurso compartido. Comparado con una comparación ordinal y con distinción entre mayúsculas y minúsculas.

Se aplica a