Partilhar via


LazyThreadSafetyMode Enumeração

Definição

Especifica como uma instância 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

ExecutionAndPublication 2

Os bloqueios são usados para garantir que apenas um único thread possa inicializar uma instância Lazy<T> de uma forma thread-safe. Efetivamente, o método de inicialização é executado de maneira thread-safe (conhecido 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, caso não haja nenhum método de inicialização) usar bloqueios internamente, poderão ocorrer deadlocks. Se você usar um construtor Lazy<T> que especifica um método de inicialização (parâmetro valueFactory) e se o método de inicialização lança uma exceção (ou não consegue manipular uma exceção) na primeira vez que você chama a propriedade Value e, em seguida, a exceção é armazenada em cache e gerada novamente em chamadas subsequentes para a propriedade Value. 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. No caso, uma chamada subsequente para a propriedade Value pode ser inicializada com êxito a Lazy<T> instância. Se acessar recursivamente o método de inicialização, a propriedade Value da instância Lazy<T>, uma InvalidOperationException será lançada.

None 0

A instância Lazy<T> não é segura para thread; se a instância é acessada de vários threads, seu comportamento é indefinido. Use esse modo apenas quando o alto desempenho é fundamental e é garantido que a instância Lazy<T> nunca será inicializada de mais de um thread. Se você usar um construtor Lazy<T> que especifica um método de inicialização (parâmetro valueFactory) e se o método de inicialização lança uma exceção (ou não consegue manipular uma exceção) na primeira vez que você chama a propriedade Value e, em seguida, a exceção é armazenada em cache e gerada novamente em chamadas subsequentes para a propriedade Value. 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. No caso, uma chamada subsequente para a propriedade Value pode ser inicializada com êxito a Lazy<T> instância. Se acessar recursivamente o método de inicialização, a propriedade Value da instância Lazy<T>, uma InvalidOperationException será lançada.

PublicationOnly 1

Quando vários threads tentam inicializar uma instância Lazy<T> simultaneamente, todos os threads têm permissão para executar o método de inicialização (ou o construtor sem parâmetros caso não haja nenhum método de inicialização). O primeiro thread para concluir a inicialização define o valor da instância de Lazy<T>. Isso é conhecido como Publication nos nomes de campo. Esse valor é retornado a outros threads que estavam executando simultaneamente o método de inicialização, a menos que o método de inicialização lance exceções nesses threads. Quaisquer instâncias de 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 lança uma exceção em qualquer thread, a exceção é propagada para fora da propriedade Value nesse thread. A exceção não é armazenada em cache. O valor da propriedade IsValueCreated permanece false e as chamadas subsequentes para a propriedade Value, sejam elas pelo thread no qual a exceção foi lançada ou por outros threads, fazem com que o método de inicialização seja executado novamente. Se acessar recursivamente o método de inicialização, a propriedade Value da instância Lazy<T>, nenhuma exceção será lançada.

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 threads 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 do 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 lançada na primeira vez que você chamar a Lazy<T>.Value propriedade, essa exceção será armazenada em cache e relançada em todas as chamadas subsequentes para a 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 sem parâmetros seja T 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 sem parâmetros não T 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 Armazenado em cache Não armazenado em cache
PublicationOnly Não armazenado em cache Não armazenado em cache
Executionandpublication Armazenado em cache Não armazenado em cache

Aplica-se a

Confira também