LazyThreadSafetyMode Enumeração
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.
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
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 |
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 |
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 |
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 |