ResourceLockAttribute Classe
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Declara que uma classe de teste ou teste é usada em um recurso compartilhado nomeado, de modo que o agendador paralelo no assembly o serialize somente em outros testes que declaram o mesmo recurso, em vez de forçar classes inteiras ou assemblies a recusar a paralelização com 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
- Herança
-
ResourceLockAttribute
- Atributos
Comentários
O recurso é identificado por uma chave de cadeia de caracteres opaca de forma livre. Dois bloqueios se referem ao mesmo recurso se e somente se suas Resource cadeias de caracteres forem iguais usando uma comparação ordinal, que diferencia maiúsculas de minúsculas. Chaves são identificadores, não caminhos: nenhuma relação hierárquica é inferida entre elas (por exemplo C:\out , e C:\out\sub são chaves não relacionadas). Prefira const campos e WellKnownResources literais de cadeia de caracteres embutidos para que um erro de digitação se torne um erro de compilação em vez de uma corrida silenciosa.
O escopo de bloqueio é somente o processo de host de teste atual. Esse atributo não é coordenado entre processos ou computadores, portanto, não torna invocações paralelas dotnet test mutuamente exclusivas.
Um bloqueio é adquirido antes de sua parte de agendamento ser iniciada e liberada após a conclusão da parte, de modo que a parte - não o método de teste individual - determina por quanto tempo um bloqueio é mantido. O que forma uma parte depende de Scope:
Em ClassLevel (o padrão) a parte é toda a classe, portanto, um bloqueio de nível de classe é feito uma vez e mantido em todos os testes da classe, abrangendo [ClassInitialize] e [ClassCleanup]. Os bloqueios da parte são a união das chaves declaradas da classe e de cada método, cada uma atualizada para o modo mais forte declarado em qualquer lugar da classe , portanto, sob esse escopo, declarar bloqueios em métodos individuais não torna o bloqueio mais granular.
Sob MethodLevel a parte há um único teste, portanto, um bloqueio de nível de classe é aplicado a cada teste individualmente e adquirido e liberado por teste. Os testes de outras classes podem, portanto, intercalar entre dois testes dessa classe e um recurso estabelecido não [ClassInitialize] pertence continuamente.[ClassCleanup]
Em ambos os casos, um bloqueio que cobre um teste é realizado entre os testes [TestInitialize] e [TestCleanup]. Quando uma parte contém mais de um bloqueio, os bloqueios são adquiridos em ordem de chave classificada por ordinal, o que torna o deadlock impossível.
Se um teste também estiver marcado DoNotParallelizeAttribute, esse atributo terá precedência e os bloqueios de recursos declarados não terão efeito: esses testes são executados na fase sequencial e nunca passam pelo agendador paralelo que adquire bloqueios.
Esse atributo é herdado: um bloqueio declarado em uma classe de teste base se aplica a cada classe derivada dele, correspondendo DoNotParallelizeAttribute. Esta é a direção conservadora - uma luminária base que toca um recurso compartilhado ainda o toca de classes derivadas, e o bloqueio excessivo apenas é mais lento enquanto o under-locking produz corridas. Observe a conseqüência: uma classe derivada não pode remover um bloqueio herdado nem enfraquecer um herdado ReadWrite para Read, portanto, sob ClassLevel um bloqueio em uma classe base amplamente usada serializa toda a hierarquia. Declare bloqueios no tipo mais derivado que realmente precisa deles.
Construtores
| Nome | Description |
|---|---|
| ResourceLockAttribute(String) |
Inicializa uma nova instância da ResourceLockAttribute classe para o recurso especificado, usando ReadWrite o acesso. |
Propriedades
| Nome | Description |
|---|---|
| Mode |
Obtém ou define o modo de acesso para o recurso. O padrão é ReadWrite (exclusivo). Definido como quando o teste lê apenas o recurso, para Read que ele possa ser executado simultaneamente com outros leitores e blocos somente em um gravador. |
| Resource |
Obtém a chave opaca que identifica o recurso compartilhado. Comparado usando uma comparação ordinal, que diferencia maiúsculas de minúsculas. |