LazyThreadSafetyMode Enumeração
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
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
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 ( |
| 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 |
| 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 |
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 |