Compartir a través de


LazyThreadSafetyMode Enumeración

Definición

Especifica cómo una instancia Lazy<T> sincroniza el acceso entre varios subprocesos.

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. De hecho, el método de inicialización se ejecuta de forma segura para subprocesos (denominado Execution en el nombre del campo). Publication del valor inicializado también es seguro para subprocesos en el sentido de que solo se puede publicar y usar un valor en todos los subprocesos. 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. 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. 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é. En ese caso, una llamada posterior a la propiedad Value podría inicializar correctamente la instancia Lazy<T>. Si el método de inicialización accede de forma recursiva a la propiedad Value de la instancia Lazy<T>, se inicia una InvalidOperationException.

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. 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. 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. 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é. En ese caso, una llamada posterior a la propiedad Value podría inicializar correctamente la instancia Lazy<T>. Si el método de inicialización accede de forma recursiva a la propiedad Value de la instancia Lazy<T>, se inicia una InvalidOperationException.

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). El primer subproceso en completar la inicialización establece el valor de la instancia Lazy<T>. Esto se conoce como Publication en los nombres de campo. 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. Todas las instancias de T creadas por los subprocesos competidores se descartan. De hecho, la publicación del valor inicializado es segura para subprocesos en el sentido de que solo uno de los valores inicializados se puede publicar y usar en todos los subprocesos. 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. La excepción no se almacena en caché. 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. 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.

Comentarios

Use esta enumeración para especificar el mode parámetro de Lazy<T> constructores. Los efectos de todos los constructores en la sincronización de subprocesos se pueden describir en términos de esta enumeración, tanto si tienen mode parámetros como si no.

Una Lazy<T> instancia se inicializa mediante un método de inicialización especificado por el usuario o por el constructor sin parámetros para T. El parámetro de un Lazy<T> constructor especifica el valueFactory método de inicialización. El método devuelve una instancia de T, que es el tipo al que se crea una instancia diferida por la instancia de Lazy<T>. Si un constructor no tiene un valueFactory parámetro , se usa el constructor sin parámetros para T para inicializar la Lazy<T> instancia. En cualquier caso, la inicialización se produce la primera vez que se llama a la Lazy<T>.Value propiedad .

Además de especificar la seguridad de subprocesos de una Lazy<T> instancia, esta enumeración afecta al almacenamiento en caché de excepciones. Cuando las excepciones se almacenan en caché para una Lazy<T> instancia, solo se obtiene una oportunidad de inicializar la instancia. Si se produce una excepción la primera vez que se llama a la Lazy<T>.Value propiedad , esa excepción se almacena en caché y se vuelve a iniciar en todas las llamadas posteriores a la Lazy<T>.Value propiedad . La ventaja de almacenar en caché las excepciones es que los dos subprocesos siempre obtienen el mismo resultado, incluso cuando se producen errores.

Al especificar el modo PublicationOnly, las excepciones nunca se almacenan en caché. Al especificar None o ExecutionAndPublication, el almacenamiento en caché depende de si se especifica un método de inicialización o se permite usar el constructor T sin parámetros. Al especificar un método de inicialización, se permite el almacenamiento en caché de excepciones para estos dos modos. El método de inicialización puede ser muy simple. Por ejemplo, podría llamar al constructor sin parámetros para T: new Lazy<Contents>(() => new Contents(), mode) en C# o New Lazy(Of Contents)(Function() New Contents()) en 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é. En la tabla siguiente se resume el comportamiento del almacenamiento en caché de excepciones.

Mode Uso del método de inicialización Uso del constructor sin parámetros para T
Ninguno Almacenado en memoria caché No almacenado en caché
PublicationOnly No almacenado en caché No almacenado en caché
ExecutionAndPublication Almacenado en memoria caché No almacenado en caché

Se aplica a

Consulte también