LazyThreadSafetyMode Enumeration

Task Parallel System.Threading

Specifies how a Lazy<(Of <(T>)>) instance should synchronize access among multiple threads.

Namespace:  System.Threading
Assembly:  System.Threading (in System.Threading.dll)

Syntax

Visual Basic (Declaration)
Public Enumeration LazyThreadSafetyMode
C#
public enum LazyThreadSafetyMode

Members

Member nameDescription
None
This mode makes no guarantees around the thread-safety of the Lazy<(Of <(T>)>) instance. If used from multiple threads, the behavior of the Lazy<(Of <(T>)>) is undefined. This mode should be used when a Lazy<(Of <(T>)>) is guaranteed to never be initialized from more than one thread simultaneously and high performance is crucial. If valueFactory throws an exception when the Lazy<(Of <(T>)>) is initialized, the exception will be cached and returned on subsequent accesses to Value. Also, if valueFactory recursively accesses Value on this Lazy<(Of <(T>)>) instance, a InvalidOperationException will be thrown.
PublicationOnly
When multiple threads attempt to simultaneously initialize a Lazy<(Of <(T>)>) instance, this mode allows each thread to execute the valueFactory but only the first thread to complete initialization will be allowed to set the final value of the Lazy<(Of <(T>)>). Once initialized successfully, any future calls to Value will return the cached result. If valueFactory throws an exception on any thread, that exception will be propagated out of Value. If any thread executes valueFactory without throwing an exception and, therefore, successfully sets the value, that value will be returned on subsequent accesses to Value from any thread. If no thread succeeds in setting the value, IsValueCreated will remain false and subsequent accesses to Value will result in the valueFactory delegate re-executing. Also, if valueFactory recursively accesses Value on this Lazy<(Of <(T>)>) instance, an exception will NOT be thrown.
ExecutionAndPublication
This mode uses locks to ensure that only a single thread can initialize a Lazy<(Of <(T>)>) instance in a thread-safe manner. In general, taken if this mode is used in conjunction with a Lazy<(Of <(T>)>) valueFactory delegate that uses locks internally, a deadlock can occur if not handled carefully. If valueFactory throws an exception when theLazy<(Of <(T>)>) is initialized, the exception will be cached and returned on subsequent accesses to Value. Also, if valueFactory recursively accesses Value on this Lazy<(Of <(T>)>) instance, a InvalidOperationException will be thrown.

See Also