정보
요청한 주제가 아래에 표시됩니다. 그러나 이 주제는 이 라이브러리에 포함되지 않습니다.

LazyThreadSafetyMode 열거형

2013-12-13

System.Lazy<T> 인스턴스가 여러 스레드 간 액세스를 동기화하는 방법을 지정합니다.

Namespace:  System.Threading
어셈블리:  mscorlib(mscorlib.dll)

public enum LazyThreadSafetyMode

멤버 이름설명
ExecutionAndPublication잠금은 단일 스레드만 Lazy<T> 인스턴스를 스레드로부터 안전한 방식으로 초기화할 수 있도록 하는 데 사용됩니다. 초기화 메서드(초기화 메서드가 없는 경우에는 기본 생성자)가 내부적으로 잠금을 사용하는 경우 교착 상태가 발생할 수 있습니다. 초기화 메서드(valueFactory 매개 변수)를 지정하는 Lazy<T> 생성자를 사용하고 Lazy<T>.Value 속성을 처음으로 호출할 때 해당 초기화 메서드가 예외를 발생할 경우(또는 예외 처리에 실패할 경우) 이후에 Lazy<T>.Value 속성을 호출하면 예외가 캐시되고 다시 발생됩니다. 초기화 메서드를 지정하지 않는 Lazy<T> 생성자를 사용할 경우에는 T에 대한 기본 생성자에서 발생되는 예외가 캐시되지 않습니다. 그러한 경우 다음에 Lazy<T>.Value 속성을 호출하면 Lazy<T> 인스턴스가 성공적으로 초기화될 수도 있습니다. 초기화 메서드가 Lazy<T> 인스턴스의 Value 속성에 재귀적으로 액세스하면 InvalidOperationException이 발생됩니다.
NoneLazy<T> 인스턴스는 스레드로부터 안전하지 않으므로 여러 스레드에서 인스턴스에 액세스할 경우 해당 인스턴스의 동작이 정의되지 않습니다. 높은 성능이 중요하고 Lazy<T> 인스턴스가 절대 두 개 이상의 스레드에서 초기화되지 않을 것임이 확실한 경우에만 이 모드를 사용하세요. 초기화 메서드(valueFactory 매개 변수)를 지정하는 Lazy<T> 생성자를 사용하고 Lazy<T>.Value 속성을 처음으로 호출할 때 해당 초기화 메서드가 예외를 발생할 경우(또는 예외 처리에 실패할 경우) 이후에 Lazy<T>.Value 속성을 호출하면 예외가 캐시되고 다시 발생됩니다. 초기화 메서드를 지정하지 않는 Lazy<T> 생성자를 사용할 경우에는 T에 대한 기본 생성자에서 발생되는 예외가 캐시되지 않습니다. 그러한 경우 다음에 Lazy<T>.Value 속성을 호출하면 Lazy<T> 인스턴스가 성공적으로 초기화될 수도 있습니다. 초기화 메서드가 Lazy<T> 인스턴스의 Value 속성에 재귀적으로 액세스하면 InvalidOperationException이 발생됩니다.
PublicationOnly여러 스레드에서 Lazy<T> 인스턴스를 동시에 초기화하려고 하면 모든 스레드에서 초기화 메서드(초기화 메서드가 없는 경우 기본 생성자)를 실행할 수 있습니다. 초기화를 완료하는 첫 번째 스레드가 Lazy<T> 인스턴스의 값을 설정합니다. 해당 스레드에서 초기화 메서드가 예외를 발생하지 않으면 이 값은 동시에 초기화 메서드를 실행 중이던 다른 모든 스레드에 반환됩니다. 경쟁 스레드에서 만든 T의 인스턴스는 모두 삭제됩니다. 임의의 스레드에서 초기화 메서드가 예외를 발생하면 해당 스레드의 Lazy<T>.Value 속성에서 예외가 전파됩니다. 예외가 캐시되지 않습니다. IsValueCreated 속성의 값이 false로 유지되고 이후에 예외가 발생된 스레드 또는 다른 스레드에서 Value 속성을 호출하면 초기화 메서드가 다시 실행됩니다. 초기화 메서드가 Lazy<T> 인스턴스의 Value 속성에 재귀적으로 액세스하면 예외가 발생하지 않습니다.

이 열거형을 사용하여 Lazy<T> 생성자의 mode 매개 변수를 지정합니다. 스레드 동기화에 대한 모든 생성자의 영향은 생성자에 mode 매개 변수가 있는지 여부와 상관 없이 이 열거형으로 설명할 수 있습니다.

Lazy<T> 인스턴스는 사용자 지정 초기화 메서드 또는 T에 대한 기본 구성자에 의해 초기화됩니다. 초기화 메서드는 Lazy<T> 생성자의 valueFactory 매개 변수에 의해 지정됩니다. 이 메서드는 Lazy<T>의 인스턴스에 의해 지연 초기화되는 형식인 T의 인스턴스를 반환합니다. 생성자에 valueFactory 매개 변수가 없는 경우 T에 대한 기본 생성자는 Lazy<T> 인스턴스를 초기화하는 데 사용됩니다. 어느 경우나 처음 Lazy<T>.Value 속성을 호출하면 초기화가 발생합니다.

Lazy<T> 인스턴스의 스레드 안전을 지정하는 것 이외에도, 이 열거형은 예외 캐싱에 영향을 미칩니다. Lazy<T> 인스턴스에 대해 예외가 캐시되면 인스턴스를 초기화할 기회가 한 번 밖에 없습니다. Lazy<T>.Value 속성을 처음으로 호출할 때 예외가 발생하면 해당 예외가 캐시되고 Lazy<T>.Value 속성에 대한 이후의 모든 호출에 다시 발생합니다. 예외를 캐싱하는 장점은 오류가 발생하는 경우에도 임의의 두 스레드가 항상 같은 결과를 얻는다는 것입니다.

PublicationOnly 모드를 지정하면 예외가 캐싱되지 않습니다. None 또는 ExecutionAndPublication을 지정하면 캐싱은 초기화 메서드를 지정할지 여부에 따라 달라지거나 사용할 T에 대한 기본 생성자를 허용합니다. 초기화 메서드를 지정하면 이러한 두 모드에 대해 예외 캐싱이 설정됩니다. 초기화 메서드는 매우 간단할 수 있습니다. 예를 들어 T의 기본 생성자를 호출할 수 있습니다. C#에서는 new Lazy<Contents>(() => new Contents(), mode)이고, Visual Basic에서는 New Lazy(Of Contents)(Function() New Contents()). 초기화 메서드를 지정하지 않는 생성자를 사용하면 T의 기본 생성자가 발생한 예외가 캐시되지 않습니다. 다음 표에서는 예외 캐싱 동작을 요약하여 보여 줍니다.

모드

초기화 메서드 사용

T에 대한 기본 생성자 사용

None

캐시됨

캐시되지 않음

PublicationOnly

캐시되지 않음

캐시되지 않음

ExecutionAndPublication

캐시됨

캐시되지 않음

Windows Phone OS

지원되는 버전: 8.0

표시: