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)

type 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.

Use this enumeration to specify the mode parameter of T:System.Lazy`1 constructors. The effects of all constructors on thread synchronization can be described in terms of this enumeration, whether or not they have mode parameters.

A T:System.Lazy`1 instance is initialized either by a user-specified initialization method or by the default constructor for T. The initialization method is specified by the valueFactory parameter of a T:System.Lazy`1 constructor. The method returns an instance of T, which is the type that is lazily instantiated by the instance of T:System.Lazy`1. If a constructor does not have a valueFactory parameter, the default constructor for T is used to initialize the T:System.Lazy`1 instance. In either case, initialization occurs the first time you call the P:System.Lazy`1.Value property.

In addition to specifying the thread safety of a T:System.Lazy`1 instance, this enumeration affects exception caching. When exceptions are cached for a T:System.Lazy`1 instance, you get only one chance to initialize the instance. If an exception is thrown the first time you call the P:System.Lazy`1.Value property, that exception is cached and rethrown on all subsequent calls to the P:System.Lazy`1.Value property. The advantage of caching exceptions is that any two threads always get the same result, even when errors occur.

When you specify the F:System.Threading.LazyThreadSafetyMode.PublicationOnly mode, exceptions are never cached. When you specify F:System.Threading.LazyThreadSafetyMode.None or F:System.Threading.LazyThreadSafetyMode.ExecutionAndPublication, caching depends on whether you specify an initialization method or allow the default constructor for T to be used. Specifying an initialization method enables exception caching for these two modes. The initialization method can be very simple. 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. 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. The following table summarizes exception caching behavior.

Mode

Using initialization method

Using default constructor for T

None

Cached

Not cached

PublicationOnly

Not cached

Not cached

ExecutionAndPublication

Cached

Not cached

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: