LazyThreadSafetyMode Enumeração

Definição

Especifica como uma Lazy<T> instância sincroniza o acesso entre múltiplos threads.

public enum class LazyThreadSafetyMode
public enum LazyThreadSafetyMode
type LazyThreadSafetyMode = 
Public Enum LazyThreadSafetyMode
Herança
LazyThreadSafetyMode

Campos

Name Valor Description
None 0

A Lazy<T> instância não é segura para threads; se a instância for acedida a partir de múltiplas threads, o seu comportamento é indefinido. Use este modo apenas quando o alto desempenho for crucial e a Lazy<T> instância estiver garantida para nunca ser inicializada a partir de mais do que um thread. Se usar um Lazy<T> construtor que especifica um método de inicialização (valueFactory parâmetro), e se esse método de inicialização lançar uma exceção (ou falhar em tratar uma exceção) na primeira vez que chama a Value propriedade, então a exceção é armazenada em cache e lançada novamente em chamadas subsequentes à Value propriedade. Se você usar um Lazy<T> construtor que não especifica um método de inicialização, as exceções lançadas pelo construtor sem parâmetros para T não são armazenadas em cache. Nesse caso, uma chamada subsequente à Value propriedade pode inicializar com sucesso a Lazy<T> instância. Se o método de inicialização aceder recursivamente à Value propriedade da Lazy<T> instância, um InvalidOperationException é lançado.

PublicationOnly 1

Quando múltiplas threads tentam inicializar uma Lazy<T> instância simultaneamente, todas as threads podem executar o método de inicialização (ou o construtor sem parâmetros, se não existir método de inicialização). O primeiro thread a completar a inicialização define o valor da Lazy<T> instância. Isto é referido como Publication nos nomes dos campos. Esse valor é devolvido a quaisquer outros threads que estivessem a executar simultaneamente o método de inicialização, a menos que o método de inicialização lance exceções nessas threads. Quaisquer instâncias T disso criadas pelos fios concorrentes são descartadas. Na prática, a publicação do valor inicializado é segura para threads no sentido de que apenas um dos valores inicializados pode ser publicado e utilizado por todos os threads. Se o método de inicialização lançar uma exceção em qualquer thread, a exceção é propagada para fora da Value propriedade nesse thread. A exceção não está em cache. O valor da IsValueCreated propriedade mantém-se false, e chamadas subsequentes à Value propriedade, seja pelo thread onde a exceção foi lançada ou por outros threads, fazem com que o método de inicialização volte a ser executado. Se o método de inicialização aceder recursivamente à Value propriedade da Lazy<T> instância, não é lançada nenhuma exceção.

ExecutionAndPublication 2

Os bloqueios são usados para garantir que apenas uma única thread pode inicializar uma Lazy<T> instância de forma segura contra threads. Na prática, o método de inicialização é executado de forma segura para threads (referida no Execution nome do campo). Publication do valor inicializado também é thread-safe no sentido em que apenas um valor pode ser publicado e usado por todas as threads. Se o método de inicialização (ou o construtor sem parâmetros, se não existir método de inicialização) usar bloqueios internamente, podem ocorrer bloqueios. Se usar um Lazy<T> construtor que especifica um método de inicialização (valueFactory parâmetro), e se esse método de inicialização lançar uma exceção (ou falhar em tratar uma exceção) na primeira vez que chama a Value propriedade, então a exceção é armazenada em cache e lançada novamente em chamadas subsequentes à Value propriedade. Se você usar um Lazy<T> construtor que não especifica um método de inicialização, as exceções lançadas pelo construtor sem parâmetros para T não são armazenadas em cache. Nesse caso, uma chamada subsequente à Value propriedade pode inicializar com sucesso a Lazy<T> instância. Se o método de inicialização aceder recursivamente à Value propriedade da Lazy<T> instância, um InvalidOperationException é lançado.

Observações

Use esta enumeração para especificar o mode parâmetro dos Lazy<T> construtores. Os efeitos de todos os construtores na sincronização de threads podem ser descritos em termos desta enumeração, independentemente de terem mode ou não parâmetros.

Uma Lazy<T> instância é inicializada quer por um método de inicialização especificado pelo utilizador, quer pelo construtor sem parâmetros para T. O método de inicialização é especificado pelo valueFactory parâmetro de um Lazy<T> construtor. O método devolve uma instância de T, que é o tipo que é instanciado preguiçosamente pela instância de Lazy<T>. Se um construtor não tiver um valueFactory parâmetro, o construtor sem parâmetros para T é usado para inicializar a Lazy<T> instância. Em qualquer dos casos, a inicialização ocorre na primeira vez que chama a Lazy<T>.Value propriedade.

Para além de especificar a segurança de threads de uma Lazy<T> instância, esta enumeração afeta o cache de exceções. Quando exceções são armazenadas em cache para uma Lazy<T> instância, só tens uma oportunidade para inicializar a instância. Se uma exceção for lançada na primeira vez que chama a Lazy<T>.Value propriedade, essa exceção é armazenada em cache e relançada em todas as chamadas subsequentes para a Lazy<T>.Value propriedade. A vantagem de guardar exceções em cache é que quaisquer dois threads obtêm sempre o mesmo resultado, mesmo quando ocorrem erros.

Quando especifica o modo PublicationOnly, as exceções nunca são armazenadas em cache. Quando especifica None ou ExecutionAndPublication, a cache depende de especificar um método de inicialização ou permitir o uso do construtor sem parâmetros para T (). A especificação de um método de inicialização habilita o cache de exceção para esses dois modos. O método de inicialização pode ser muito simples. Por exemplo, ele pode chamar o construtor sem parâmetros para T: new Lazy<Contents>(() => new Contents(), mode) em C# ou New Lazy(Of Contents)(Function() New Contents()) no Visual Basic. Se usar um construtor que não especifica um método de inicialização, exceções que são lançadas pelo construtor sem parâmetros para T não são armazenadas em cache. A tabela seguinte resume o comportamento de cache de exceções.

Mode Usando o método de inicialização Uso de construtor sem parâmetros para T
None Em cache Não armazenado em cache
Apenas Publicação Não armazenado em cache Não armazenado em cache
Execução e Publicação Em cache Não armazenado em cache

Aplica-se a

Ver também