Este artículo se tradujo automáticamente. Para ver el artículo en inglés, active la casilla Inglés. Además, puede mostrar el texto en inglés en una ventana emergente si mueve el puntero del mouse sobre el texto.
Traducción
Inglés

Enumeración LazyThreadSafetyMode

 

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

Espacio de nombres:   System.Threading
Ensamblado:  mscorlib (en mscorlib.dll)

public enum LazyThreadSafetyMode

Nombre de miembroDescripción
ExecutionAndPublication

Los bloqueos se usan para garantizar que solo un subproceso pueda inicializar una instancia Lazy<T> de manera segura para subprocesos. 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. 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 Lazy<T>.Value, la excepción se almacena en caché y se vuelve a iniciar en las llamadas posteriores a la propiedad Lazy<T>.Value. 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é. En ese caso, una llamada posterior a la propiedad Lazy<T>.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

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 Lazy<T>.Value, la excepción se almacena en caché y se vuelve a iniciar en las llamadas posteriores a la propiedad Lazy<T>.Value. 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é. En ese caso, una llamada posterior a la propiedad Lazy<T>.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

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). El primer subproceso en completar la inicialización establece el valor de la instancia Lazy<T>. 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. Si el método de inicialización inicia una excepción en cualquier subproceso, la excepción se propaga fuera de la propiedad Lazy<T>.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.

Utilice 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 pueden describirse en cuanto a esta enumeración si no tienen mode parámetros.

A Lazy<T> instancia se inicializa mediante un método de inicialización especificada por el usuario o mediante el constructor predeterminado para T. El método de inicialización especificado por el valueFactory parámetro de un 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>. Si un constructor no tiene un valueFactory parámetro, el constructor predeterminado para T se utiliza para inicializar el Lazy<T> instancia. En cualquier caso, la inicialización se produce la primera vez que llame el Lazy<T>.Value propiedad.

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

Cuando se especifica la PublicationOnly modo, las excepciones nunca se almacenan en caché. Cuando se especifica None 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. Especificar un método de inicialización permite excepción almacenamiento en caché para estos dos modos. El método de inicialización puede ser muy simple. Por ejemplo, podría llamar el constructor predeterminado para T: new Lazy<Contents>(() => new Contents(), mode) en C#, o New Lazy(Of Contents)(Function() New Contents()) en 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é. La siguiente tabla resume el almacenamiento en caché de comportamiento de excepción.

Modo

Utilizando el método de inicialización

Usando el constructor predeterminado paraT

None

En caché

No almacena en caché

PublicationOnly

No almacena en caché

No almacena en caché

ExecutionAndPublication

En caché

No almacena en caché

Plataforma universal de Windows
Disponible desde 8
.NET Framework
Disponible desde 4.0
Biblioteca de clases portable
Se admite en: plataformas portátiles de .NET
Silverlight
Disponible desde 4.0
Windows Phone Silverlight
Disponible desde 8.0
Windows Phone
Disponible desde 8.1
Volver al principio
Mostrar: