LazyThreadSafetyMode LazyThreadSafetyMode LazyThreadSafetyMode LazyThreadSafetyMode Enum

Definición

Especifica cómo una instancia Lazy<T> sincroniza el acceso entre varios subprocesos.Specifies how a Lazy<T> instance synchronizes access among multiple threads.

public enum class LazyThreadSafetyMode
public enum LazyThreadSafetyMode
type LazyThreadSafetyMode = 
Public Enum LazyThreadSafetyMode
Herencia
LazyThreadSafetyModeLazyThreadSafetyModeLazyThreadSafetyModeLazyThreadSafetyMode

Campos

ExecutionAndPublication ExecutionAndPublication ExecutionAndPublication ExecutionAndPublication 2

Los bloqueos se usan para garantizar que solo un subproceso pueda inicializar una instancia Lazy<T> de manera segura para subprocesos.Locks are used to ensure that only a single thread can initialize a Lazy<T> instance in a thread-safe manner. Si el método de inicialización (o el constructor predeterminado, si no hay ningún método de inicialización) usa los bloqueos internamente, pueden producirse interbloqueos.If the initialization method (or the default constructor, if there is no initialization method) uses locks internally, deadlocks can occur. Si usa un constructor Lazy<T> que especifica un método de inicialización (parámetro valueFactory) y si ese método de inicialización inicia una excepción (o no puede controlar una excepción) la primera vez que se llama a la propiedad Value, la excepción se almacena en caché y se vuelve a iniciar en las llamadas posteriores a la propiedad Value.If you use a Lazy<T> constructor that specifies an initialization method (valueFactory parameter), and if that initialization method throws an exception (or fails to handle an exception) the first time you call the Value property, then the exception is cached and thrown again on subsequent calls to the Value property. Si usa un constructor Lazy<T> que no especifica un método de inicialización, las excepciones que inicie el constructor predeterminado para T no se almacenarán en caché.If you use a Lazy<T> constructor that does not specify an initialization method, exceptions that are thrown by the default constructor for T are not cached. En ese caso, una llamada posterior a la propiedad Value podría inicializar correctamente la instancia Lazy<T>.In that case, a subsequent call to the Value property might successfully initialize the Lazy<T> instance. Si el método de inicialización accede de forma recursiva a la propiedad Value de la instancia Lazy<T>, se inicia una InvalidOperationException.If the initialization method recursively accesses the Value property of the Lazy<T> instance, an InvalidOperationException is thrown.

None None None None 0

La instancia Lazy<T> no es segura para subprocesos; si se accede a la instancia desde varios subprocesos, su comportamiento está sin definir.The Lazy<T> instance is not thread safe; if the instance is accessed from multiple threads, its behavior is undefined. Use este modo solo si es indispensable un rendimiento alto y si se garantiza que la instancia Lazy<T> nunca se inicializará desde más de un subproceso.Use this mode only when high performance is crucial and the Lazy<T> instance is guaranteed never to be initialized from more than one thread. Si usa un constructor Lazy<T> que especifica un método de inicialización (parámetro valueFactory) y si ese método de inicialización inicia una excepción (o no puede controlar una excepción) la primera vez que se llama a la propiedad Value, la excepción se almacena en caché y se vuelve a iniciar en las llamadas posteriores a la propiedad Value.If you use a Lazy<T> constructor that specifies an initialization method (valueFactory parameter), and if that initialization method throws an exception (or fails to handle an exception) the first time you call the Value property, then the exception is cached and thrown again on subsequent calls to the Value property. Si usa un constructor Lazy<T> que no especifica un método de inicialización, las excepciones que inicie el constructor predeterminado para T no se almacenarán en caché.If you use a Lazy<T> constructor that does not specify an initialization method, exceptions that are thrown by the default constructor for T are not cached. En ese caso, una llamada posterior a la propiedad Value podría inicializar correctamente la instancia Lazy<T>.In that case, a subsequent call to the Value property might successfully initialize the Lazy<T> instance. Si el método de inicialización accede de forma recursiva a la propiedad Value de la instancia Lazy<T>, se inicia una InvalidOperationException.If the initialization method recursively accesses the Value property of the Lazy<T> instance, an InvalidOperationException is thrown.

PublicationOnly PublicationOnly PublicationOnly PublicationOnly 1

Si varios subprocesos intentan inicializar una instancia Lazy<T> simultáneamente, se permite a todos los subprocesos ejecutar el método de inicialización (o el constructor predeterminado, si no hay ningún método de inicialización).When multiple threads try to initialize a Lazy<T> instance simultaneously, all threads are allowed to run the initialization method (or the default constructor, if there is no initialization method). El primer subproceso en completar la inicialización establece el valor de la instancia Lazy<T>.The first thread to complete initialization sets the value of the Lazy<T> instance. Dicho valor se devuelve a todos los demás subprocesos que estaban ejecutando simultáneamente el método de inicialización, a menos que el método de inicialización inicie excepciones en esos subprocesos.That value is returned to any other threads that were simultaneously running the initialization method, unless the initialization method throws exceptions on those threads. Todas las instancias de T creadas por los subprocesos competidores se descartan.Any instances of T that were created by the competing threads are discarded. Si el método de inicialización inicia una excepción en cualquier subproceso, la excepción se propaga fuera de la propiedad Value en ese subproceso.If the initialization method throws an exception on any thread, the exception is propagated out of the Value property on that thread. La excepción no se almacena en caché.The exception is not cached. El valor de la propiedad IsValueCreated permanece false y las llamadas posteriores a la propiedad Value, ya sean del subproceso donde se inició la excepción o de otros subprocesos, harán que el método de inicialización se ejecute de nuevo.The value of the IsValueCreated property remains false, and subsequent calls to the Value property, either by the thread where the exception was thrown or by other threads, cause the initialization method to run again. Si el método de inicialización accede de forma recursiva a la propiedad Value de la instancia Lazy<T>, no se inicia ninguna excepción.If the initialization method recursively accesses the Value property of the Lazy<T> instance, no exception is thrown.

Comentarios

Utilice esta enumeración para especificar el mode parámetro de Lazy<T> constructores.Use this enumeration to specify the mode parameter of Lazy<T> constructors. Los efectos de todos los constructores en sincronización de subprocesos se pueden describir en términos de esta enumeración, tengan o no mode parámetros.The effects of all constructors on thread synchronization can be described in terms of this enumeration, whether or not they have mode parameters.

Un Lazy<T> instancia se inicializa mediante un método de inicialización especificado por el usuario o mediante el constructor predeterminado para T.A Lazy<T> instance is initialized either by a user-specified initialization method or by the default constructor for T. El método de inicialización especificado por el valueFactory parámetro de un Lazy<T> constructor.The initialization method is specified by the valueFactory parameter of a Lazy<T> constructor. El método devuelve una instancia de T, que es el tipo que se crea una instancia por la instancia de forma diferida Lazy<T>.The method returns an instance of T, which is the type that is lazily instantiated by the instance of Lazy<T>. Si no tiene un constructor un valueFactory parámetro, el constructor predeterminado para T se usa para inicializar el Lazy<T> instancia.If a constructor does not have a valueFactory parameter, the default constructor for T is used to initialize the Lazy<T> instance. En cualquier caso, la inicialización se produce la primera vez que llama el Lazy<T>.Value propiedad.In either case, initialization occurs the first time you call the Lazy<T>.Value property.

Además de especificar la seguridad para subprocesos de un Lazy<T> instancia, esta enumeración afecta a la excepción de almacenamiento en caché.In addition to specifying the thread safety of a Lazy<T> instance, this enumeration affects exception caching. Cuando las excepciones se almacenan en caché para un Lazy<T> instancia, recibirá solo una oportunidad de inicializar la instancia.When exceptions are cached for a Lazy<T> instance, you get only one chance to initialize the instance. Si se produce una excepción la primera vez que se llama a la Lazy<T>.Value propiedad que excepción se almacena en caché y vuelve a iniciar en todas las llamadas posteriores a la Lazy<T>.Value propiedad.If an exception is thrown the first time you call the Lazy<T>.Value property, that exception is cached and rethrown on all subsequent calls to the Lazy<T>.Value property. La ventaja de almacenamiento en caché de excepciones es que los dos subprocesos siempre obtención el mismo resultado, incluso cuando se producen errores.The advantage of caching exceptions is that any two threads always get the same result, even when errors occur.

Cuando se especifica el modo PublicationOnly, nunca se almacenan en caché de excepciones.When you specify the PublicationOnly mode, exceptions are never cached. Cuando se especifica ninguno o ExecutionAndPublication, almacenamiento en caché depende de si se especifica un método de inicialización o permitir que el constructor predeterminado para T para usarse.When you specify None or ExecutionAndPublication, caching depends on whether you specify an initialization method or allow the default constructor for T to be used. Al especificar un método de inicialización, se permite el almacenamiento en caché de excepciones para estos dos modos.Specifying an initialization method enables exception caching for these two modes. El método de inicialización puede ser muy simple.The initialization method can be very simple. Por ejemplo, podría llamar al constructor predeterminado para T: new Lazy<Contents>(() => new Contents(), mode) en C#, o New Lazy(Of Contents)(Function() New Contents()) en Visual Basic.For example, it might call the default constructor for T: new Lazy<Contents>(() => new Contents(), mode) in C#, or New Lazy(Of Contents)(Function() New Contents()) in Visual Basic. Si utiliza un constructor que no especifica un método de inicialización, las excepciones producidas por el constructor predeterminado para T no se almacenan en caché.If you use a constructor that does not specify an initialization method, exceptions that are thrown by the default constructor for T are not cached. La siguiente tabla resume el comportamiento de almacenamiento en caché de excepciones.The following table summarizes exception caching behavior.

ModoMode Mediante el método de inicializaciónUsing initialization method Utilizando el constructor predeterminado para TUsing default constructor for T
NoneNone En cachéCached No almacenar en cachéNot cached
PublicationOnlyPublicationOnly No almacenar en cachéNot cached No almacenar en cachéNot cached
ExecutionAndPublicationExecutionAndPublication En cachéCached No almacenar en cachéNot cached

Se aplica a

Consulte también: