LazyThreadSafetyMode Enumeración

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
LazyThreadSafetyMode

Campos

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 sin parámetros, si no hay ningún método de inicialización) usa los bloqueos internamente, pueden producirse interbloqueos.If the initialization method (or the parameterless 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 sin parámetros 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 parameterless 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 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 sin parámetros 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 parameterless 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 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 sin parámetros, 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 parameterless 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 mode el parámetro Lazy<T> de los constructores.Use this enumeration to specify the mode parameter of Lazy<T> constructors. Los efectos de todos los constructores en la sincronización de subprocesos se pueden describir en términos de esta enumeración mode , tanto si tienen parámetros como si no.The effects of all constructors on thread synchronization can be described in terms of this enumeration, whether or not they have mode parameters.

Una Lazy<T> instancia se inicializa mediante un método de inicialización especificado por el usuario o por el constructor sin parámetros Tpara.A Lazy<T> instance is initialized either by a user-specified initialization method or by the parameterless constructor for T. El método de inicialización se especifica valueFactory mediante el parámetro Lazy<T> de un 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 del que se crea una instancia de forma diferida por la instancia de. Lazy<T>The method returns an instance of T, which is the type that is lazily instantiated by the instance of Lazy<T>. Si un constructor no tiene un valueFactory parámetro, se utiliza el constructor sin parámetros para T inicializar la Lazy<T> instancia.If a constructor does not have a valueFactory parameter, the parameterless constructor for T is used to initialize the Lazy<T> instance. En cualquier caso, la inicialización se produce la primera vez Lazy<T>.Value que se llama a la 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 Lazy<T> una instancia, esta enumeración afecta al almacenamiento en caché de excepciones.In addition to specifying the thread safety of a Lazy<T> instance, this enumeration affects exception caching. Cuando se almacenan en caché las Lazy<T> excepciones de una instancia, solo se obtiene una oportunidad para 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 Lazy<T>.Value a la propiedad, esa excepción se almacena en caché y se vuelve a producir en todas Lazy<T>.Value las llamadas subsiguientes a la 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 las excepciones de almacenamiento en caché es que dos subprocesos siempre obtienen 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, las excepciones nunca se almacenan en caché.When you specify the PublicationOnly mode, exceptions are never cached. Cuando se especifica None o ExecutionAndPublication, Caching depende de si se especifica un método de inicialización o se permite el T uso del constructor sin parámetros para.When you specify None or ExecutionAndPublication, caching depends on whether you specify an initialization method or allow the parameterless 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 sin parámetros Tpara: new Lazy<Contents>(() => new Contents(), mode) in C#o New Lazy(Of Contents)(Function() New Contents()) en Visual Basic.For example, it might call the parameterless constructor for T: new Lazy<Contents>(() => new Contents(), mode) in C#, or New Lazy(Of Contents)(Function() New Contents()) in Visual Basic. Si usa un constructor que no especifica un método de inicialización, las excepciones producidas por el constructor sin parámetros 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 parameterless constructor for T are not cached. En la tabla siguiente se resume el comportamiento del almacenamiento en caché de excepciones.The following table summarizes exception caching behavior.

ModoMode Usar el método de inicializaciónUsing initialization method Usar el constructor sin parámetros paraTUsing parameterless constructor for T
NingunaNone En cachéCached No almacenado en cachéNot cached
PublicationOnlyPublicationOnly No almacenado en cachéNot cached No almacenado en cachéNot cached
ExecutionAndPublicationExecutionAndPublication En cachéCached No almacenado en cachéNot cached

Se aplica a

Consulte también: