Compartilhar via


LazyThreadSafetyMode Enumeração

Definição

Especifica como uma instância de Lazy<T> sincroniza o acesso entre vários threads.

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

Campos

Nome Valor Description
None 0

A Lazy<T> instância não é thread-safe; se a instância for acessada de vários threads, seu comportamento será indefinido. Use esse modo somente quando o alto desempenho for crucial e a Lazy<T> instância tiver a garantia de nunca ser inicializada de mais de um thread. Se você usar um Lazy<T> construtor que especifica um método de inicialização (valueFactory parâmetro) e se esse método de inicialização gerar uma exceção (ou não tratar uma exceção) na primeira vez que você chamar a Value propriedade, a exceção será armazenada em cache e lançada novamente em chamadas subsequentes para a Value propriedade. Se você usar um construtor Lazy<T> que não especifique um método de inicialização, as exceções geradas pelo construtor sem parâmetros para T não serão armazenadas em cache. Nesse caso, uma chamada subsequente à Value propriedade pode inicializar com êxito a Lazy<T> instância. Se o método de inicialização acessar recursivamente a Value propriedade da Lazy<T> instância, um InvalidOperationException será gerado.

PublicationOnly 1

Quando vários threads tentam inicializar uma Lazy<T> instância simultaneamente, todos os threads têm permissão para executar o método de inicialização (ou o construtor sem parâmetros, se não houver nenhum método de inicialização). O primeiro thread para concluir a inicialização define o valor da Lazy<T> instância. Isso é conhecido como Publication nos nomes de campo. Esse valor é retornado para quaisquer outros threads que estavam executando simultaneamente o método de inicialização, a menos que o método de inicialização gere exceções nesses threads. Todas as instâncias T que foram criadas pelos threads concorrentes são descartadas. Efetivamente, a publicação do valor inicializado é thread-safe no sentido de que apenas um dos valores inicializados pode ser publicado e usado por todos os threads. Se o método de inicialização gerar uma exceção em qualquer thread, a exceção será propagada para fora da Value propriedade nesse thread. A exceção não é armazenada em cache. O valor da IsValueCreated propriedade permanece e as chamadas subsequentes falseà Value propriedade, pelo thread em que a exceção foi lançada ou por outros threads, fazem com que o método de inicialização seja executado novamente. Se o método de inicialização acessar recursivamente a Value propriedade da Lazy<T> instância, nenhuma exceção será gerada.

ExecutionAndPublication 2

Os bloqueios são usados para garantir que apenas um único thread possa inicializar uma Lazy<T> instância de maneira thread-safe. Efetivamente, o método de inicialização é executado de maneira thread-safe (conhecida como Execution no nome do campo). Publication do valor inicializado também é thread-safe no sentido de que apenas um valor pode ser publicado e usado por todos os threads. Se o método de inicialização (ou o construtor sem parâmetros, se não houver nenhum método de inicialização) usar bloqueios internamente, poderão ocorrer deadlocks. Se você usar um Lazy<T> construtor que especifica um método de inicialização (valueFactory parâmetro) e se esse método de inicialização gerar uma exceção (ou não tratar uma exceção) na primeira vez que você chamar a Value propriedade, a exceção será armazenada em cache e lançada novamente em chamadas subsequentes para a Value propriedade. Se você usar um construtor Lazy<T> que não especifique um método de inicialização, as exceções geradas pelo construtor sem parâmetros para T não serão armazenadas em cache. Nesse caso, uma chamada subsequente à Value propriedade pode inicializar com êxito a Lazy<T> instância. Se o método de inicialização acessar recursivamente a Value propriedade da Lazy<T> instância, um InvalidOperationException será gerado.

Comentários

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

Uma Lazy<T> instância é inicializada por um método de inicialização especificado pelo usuário ou 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 retorna uma instância de T, que é o tipo que é preguiçosamente instanciado pela instância de Lazy<T>. Se um construtor não tiver um valueFactory parâmetro, o construtor sem parâmetros será T usado para inicializar a Lazy<T> instância. Em ambos os casos, a inicialização ocorre na primeira vez que você chama a Lazy<T>.Value propriedade.

Além de especificar a segurança de thread de uma Lazy<T> instância, essa enumeração afeta o cache de exceção. Quando as exceções são armazenadas em cache para uma Lazy<T> instância, você tem apenas uma chance de inicializar a instância. Se uma exceção for gerada na primeira vez que você chamar a Lazy<T>.Value propriedade, essa exceção será armazenada em cache e será relançada em todas as chamadas subsequentes à Lazy<T>.Value propriedade. A vantagem das exceções de cache é que todos os dois threads sempre obtêm o mesmo resultado, mesmo quando ocorrem erros.

Quando você especifica o modo PublicationOnly, as exceções nunca são armazenadas em cache. Quando você especifica None ou ExecutionAndPublication, o cache depende de você especificar um método de inicialização ou permitir que o construtor T sem parâmetros seja usado. Especificar um método de inicialização permite o cache de exceções 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()) em Visual Basic. Se você usar um construtor que não especifique um método de inicialização, as exceções geradas pelo construtor T sem parâmetros não serão armazenadas em cache. A tabela a seguir resume o comportamento de cache de exceção.

Modo Usando o método de inicialização Usando o construtor sem parâmetros para T
Nenhum Cache Não armazenado em cache
PublicationOnly Não armazenado em cache Não armazenado em cache
Executionandpublication Cache Não armazenado em cache

Aplica-se a

Confira também