Lingua

ResourceLockAttribute Classe

Definizione

Dichiara che una classe di test o test è in contrasto con una risorsa condivisa denominata, in modo che l'utilità di pianificazione parallela in-assembly la serializzi solo su altri test che dichiarano la stessa risorsa, anziché forzare intere classi o assembly a rifiutare esplicitamente la parallelizzazione 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
Ereditarietà
ResourceLockAttribute
Attributi

Commenti

La risorsa è identificata da una chiave stringa opaca in formato libero. Due blocchi fanno riferimento alla stessa risorsa se e solo se le stringhe Resource sono uguali usando un confronto ordinale con distinzione tra maiuscole e minuscole. Le chiavi sono identificatori, non percorsi: nessuna relazione gerarchica viene dedotta tra di esse (ad esempio C:\out e C:\out\sub sono chiavi non correlate). Preferisce const i campi e WellKnownResources i valori letterali stringa inline in modo che un errore di digitatura diventi un errore di compilazione anziché una gara invisibile all'utente.

L'ambito di blocco è solo il processo host di test corrente. Questo attributo non si coordina tra processi o computer, quindi non esegue chiamate parallele dotnet test che si escludono a vicenda.

Un blocco viene acquisito prima dell'avvio e del rilascio del blocco prima dell'avvio e del rilascio del blocco, quindi il blocco, non il singolo metodo di test, determina per quanto tempo viene mantenuto un blocco. La forma di un blocco dipende da Scope:

In ClassLevel (impostazione predefinita) il blocco è l'intera classe, quindi un blocco a livello di classe viene eseguito una sola volta e mantenuto in ogni test della classe, che si estende su [ClassInitialize] e [ClassCleanup]. I blocchi del blocco sono l'unione delle chiavi dichiarate della classe e di ogni metodo, ognuna aggiornata alla modalità più complessa dichiarata ovunque nella classe, quindi in questo ambito dichiarando blocchi sui singoli metodi non viene eseguito un blocco più granulare.

Nel MethodLevel blocco è un singolo test, quindi un blocco a livello di classe viene applicato a ogni test singolarmente e acquisito e rilasciato per ogni test. I test di altre classi possono quindi interleaversi tra due test di questa classe e una risorsa stabilita in [ClassInitialize] non è di proprietà continua tramite [ClassCleanup].

In entrambi i casi un blocco che copre un test viene mantenuto in tutti i test e [TestInitialize][TestCleanup]. Quando un blocco contiene più blocchi, i blocchi vengono acquisiti in ordine ordinale di chiavi, il che rende impossibile il deadlock.

Se un test è contrassegnato anche come DoNotParallelizeAttribute, l'attributo ha la precedenza e i blocchi di risorse dichiarati non hanno alcun effetto: tali test vengono eseguiti nella fase sequenziale e non passano mai attraverso l'utilità di pianificazione parallela che acquisisce blocchi.

Questo attributo viene ereditato: un blocco dichiarato in una classe di test di base si applica a ogni classe derivata da essa, corrispondente DoNotParallelizeAttributea . Questa è la direzione conservativa: una fixture di base che tocca ancora una risorsa condivisa lo tocca dalle classi derivate e il sovraccarico viene semplicemente eseguito più lentamente mentre l'under-locking produce gare. Si noti la conseguenza: una classe derivata non può rimuovere un blocco ereditato, né indebolire un ereditato ReadWrite in Read, quindi in ClassLevel un blocco su una classe di base ampiamente usata serializza l'intera gerarchia. Dichiara i blocchi sul tipo più derivato che effettivamente ne ha bisogno.

Costruttori

Nome Descrizione
ResourceLockAttribute(String)

Inizializza una nuova istanza della classe per la ResourceLockAttribute risorsa specificata, utilizzando ReadWrite l'accesso.

Proprietà

Nome Descrizione
Mode

Ottiene o imposta la modalità di accesso per la risorsa. Il valore predefinito è ReadWrite (esclusivo). Impostare su Read quando il test legge solo la risorsa, in modo che possa essere eseguita simultaneamente con altri lettori e blocchi solo su un writer.

Resource

Ottiene la chiave opaca che identifica la risorsa condivisa. Confronto con un confronto ordinale con distinzione tra maiuscole e minuscole.

Si applica a