LazyThreadSafetyMode LazyThreadSafetyMode LazyThreadSafetyMode LazyThreadSafetyMode Enum

定義

Lazy<T> インスタンスが複数のスレッド間でアクセスを同期する方法を指定します。Specifies how a Lazy<T> instance synchronizes access among multiple threads.

public enum class LazyThreadSafetyMode
public enum LazyThreadSafetyMode
type LazyThreadSafetyMode = 
Public Enum LazyThreadSafetyMode
継承
LazyThreadSafetyModeLazyThreadSafetyModeLazyThreadSafetyModeLazyThreadSafetyMode

フィールド

ExecutionAndPublication ExecutionAndPublication ExecutionAndPublication ExecutionAndPublication 2

ロックを使って確実に 1 つのスレッドのみが Lazy<T> インスタンスをスレッド セーフな方法で初期化します。Locks are used to ensure that only a single thread can initialize a Lazy<T> instance in a thread-safe manner. 初期化メソッド (初期化メソッドがない場合は、パラメーターなしのコンストラクター) は内部でロックを使うため、デッドロックが発生することがあります。If the initialization method (or the parameterless constructor, if there is no initialization method) uses locks internally, deadlocks can occur. 初期化メソッドを指定した (valueFactory パラメーター) Lazy<T> コンストラクターを使った場合に、Value プロパティを初回に呼び出したときに初期化メソッドが例外をスローした (または例外のハンドルに失敗した) 場合、その例外はキャッシュされ、それ以降に Value プロパティを呼び出した時点で再度スローされます。If you use a Lazy<T> constructor that specifies an initialization method (valueFactory parameter), and if that initialization method throws an exception (or fails to handle an exception) the first time you call the Value property, then the exception is cached and thrown again on subsequent calls to the Value property. 初期化メソッドを指定しない Lazy<T> コンストラクターを使用する場合、T についてパラメーターなしのコンストラクターからスローされる例外はキャッシュされません。If you use a Lazy<T> constructor that does not specify an initialization method, exceptions that are thrown by the parameterless constructor for T are not cached. その場合、Value プロパティへの後続の呼び出しで Lazy<T> インスタンスが正常に初期化される可能性があります。In that case, a subsequent call to the Value property might successfully initialize the Lazy<T> instance. 初期化メソッドが Lazy<T> インスタンスの Value プロパティに再帰的にアクセスすると、InvalidOperationException がスローされます。If the initialization method recursively accesses the Value property of the Lazy<T> instance, an InvalidOperationException is thrown.

None None None None 0

Lazy<T> インスタンスはスレッド セーフではありません。インスタンスに複数のスレッドからアクセスした場合の動作は未定義です。The Lazy<T> instance is not thread safe; if the instance is accessed from multiple threads, its behavior is undefined. 高いパフォーマンスが重要であり、Lazy<T> インスタンスが複数のスレッドから初期化されないことが保証されている場合にのみ、このモードを使ってください。Use this mode only when high performance is crucial and the Lazy<T> instance is guaranteed never to be initialized from more than one thread. 初期化メソッドを指定した (valueFactory パラメーター) Lazy<T> コンストラクターを使った場合に、Value プロパティを初回に呼び出したときに初期化メソッドが例外をスローした (または例外のハンドルに失敗した) 場合、その例外はキャッシュされ、それ以降に Value プロパティを呼び出した時点で再度スローされます。If you use a Lazy<T> constructor that specifies an initialization method (valueFactory parameter), and if that initialization method throws an exception (or fails to handle an exception) the first time you call the Value property, then the exception is cached and thrown again on subsequent calls to the Value property. 初期化メソッドを指定しない Lazy<T> コンストラクターを使用する場合、T についてパラメーターなしのコンストラクターからスローされる例外はキャッシュされません。If you use a Lazy<T> constructor that does not specify an initialization method, exceptions that are thrown by the parameterless constructor for T are not cached. その場合、Value プロパティへの後続の呼び出しで Lazy<T> インスタンスが正常に初期化される可能性があります。In that case, a subsequent call to the Value property might successfully initialize the Lazy<T> instance. 初期化メソッドが Lazy<T> インスタンスの Value プロパティに再帰的にアクセスすると、InvalidOperationException がスローされます。If the initialization method recursively accesses the Value property of the Lazy<T> instance, an InvalidOperationException is thrown.

PublicationOnly PublicationOnly PublicationOnly PublicationOnly 1

複数のスレッドで Lazy<T> のインスタンスを同時に初期化しようとすると、すべてのスレッドで初期化メソッド (または、初期化メソッドが存在しない場合はパラメーターなしのコンストラクター) の実行が許可されます。When multiple threads try to initialize a Lazy<T> instance simultaneously, all threads are allowed to run the initialization method (or the parameterless constructor, if there is no initialization method). 最初に初期化を完了したスレッドが Lazy<T> インスタンスの値を設定します。The first thread to complete initialization sets the value of the Lazy<T> instance. 初期化メソッドを同時に実行したその他のスレッドには、その値が返されます。ただし、それらのスレッドで初期化メソッドが例外をスローした場合を除きます。That value is returned to any other threads that were simultaneously running the initialization method, unless the initialization method throws exceptions on those threads. 競合するスレッドによって作成された T のインスタンスは、すべて破棄されます。Any instances of T that were created by the competing threads are discarded. いずれかのスレッドで初期化メソッドが例外をスローした場合、その例外はそのスレッドの Value プロパティの外に伝達されます。If the initialization method throws an exception on any thread, the exception is propagated out of the Value property on that thread. 例外はキャッシュされません。The exception is not cached. IsValueCreated プロパティの値は false のままになります。その後、例外がスローされたスレッドまたは他のスレッドが Value プロパティを呼び出すと、初期化メソッドは再実行されます。The value of the IsValueCreated property remains false, and subsequent calls to the Value property, either by the thread where the exception was thrown or by other threads, cause the initialization method to run again. 初期化メソッドが Value インスタンスの Lazy<T> プロパティに再帰的にアクセスしても、例外はスローされません。If the initialization method recursively accesses the Value property of the Lazy<T> instance, no exception is thrown.

注釈

この列挙体を使用しmodeて、 Lazy<T>コンストラクターのパラメーターを指定します。Use this enumeration to specify the mode parameter of Lazy<T> constructors. スレッド同期に対するすべてのコンストラクターの影響は、パラメーターがあるmodeかどうかにかかわらず、この列挙体の観点から記述できます。The effects of all constructors on thread synchronization can be described in terms of this enumeration, whether or not they have mode parameters.

インスタンスは、ユーザー指定の初期化メソッドか、のパラメーターなしのTコンストラクターによって初期化されます。 Lazy<T>A Lazy<T> instance is initialized either by a user-specified initialization method or by the parameterless constructor for T. 初期化メソッドは、 valueFactory Lazy<T>コンストラクターのパラメーターによって指定されます。The initialization method is specified by the valueFactory parameter of a Lazy<T> constructor. メソッドはT、のインスタンスを返します。これは、のLazy<T>インスタンスによって遅延的にインスタンス化される型です。The method returns an instance of T, which is the type that is lazily instantiated by the instance of Lazy<T>. コンストラクターにvalueFactoryパラメーターがない場合は、のパラメーターなしのTコンストラクターを使用してLazy<T>インスタンスが初期化されます。If a constructor does not have a valueFactory parameter, the parameterless constructor for T is used to initialize the Lazy<T> instance. どちらの場合も、 Lazy<T>.Valueプロパティを初めて呼び出すときに初期化が発生します。In either case, initialization occurs the first time you call the Lazy<T>.Value property.

この列挙体は、 Lazy<T>インスタンスのスレッドセーフを指定するだけでなく、例外のキャッシュにも影響します。In addition to specifying the thread safety of a Lazy<T> instance, this enumeration affects exception caching. Lazy<T>インスタンスに対して例外がキャッシュされると、インスタンスを初期化する機会が1つだけ返されます。When exceptions are cached for a Lazy<T> instance, you get only one chance to initialize the instance. 最初にLazy<T>.Valueプロパティを呼び出したときに例外がスローされた場合、その例外はキャッシュされ、その後Lazy<T>.Valueのプロパティのすべての呼び出しで再スローされます。If an exception is thrown the first time you call the Lazy<T>.Value property, that exception is cached and rethrown on all subsequent calls to the Lazy<T>.Value property. 例外のキャッシュの利点は、エラーが発生した場合でも、任意の2つのスレッドが常に同じ結果を得ることです。The advantage of caching exceptions is that any two threads always get the same result, even when errors occur.

[パブリケーションのみ] モードを指定すると、例外はキャッシュされません。When you specify the PublicationOnly mode, exceptions are never cached. None または executionandpublication を指定すると、のキャッシュは、初期化メソッドを指定するか、のパラメーター Tなしのコンストラクターを使用できるようにするかによって異なります。When you specify None or ExecutionAndPublication, caching depends on whether you specify an initialization method or allow the parameterless constructor for T to be used. 初期化メソッドを指定すると、この 2 つのモードで例外キャッシュが有効になります。Specifying an initialization method enables exception caching for these two modes. 初期化メソッドは非常に単純にすることができます。The initialization method can be very simple. たとえば、のT場合は、のnew Lazy<Contents>(() => new Contents(), mode) C#場合はパラメーターなしのコンストラクターをNew Lazy(Of Contents)(Function() New Contents()) 、Visual Basic の場合はを呼び出します。For example, it might call the parameterless constructor for T: new Lazy<Contents>(() => new Contents(), mode) in C#, or New Lazy(Of Contents)(Function() New Contents()) in Visual Basic. 初期化メソッドを指定しないコンストラクターを使用する場合、のパラメーターなしのTコンストラクターによってスローされる例外はキャッシュされません。If you use a constructor that does not specify an initialization method, exceptions that are thrown by the parameterless constructor for T are not cached. 次の表は、例外のキャッシュ動作をまとめたものです。The following table summarizes exception caching behavior.

モードMode 初期化メソッドの使用Using initialization method のパラメーターなしのコンストラクターの使用TUsing parameterless constructor for T
NoneNone キャッシュ済みCached キャッシュなしNot cached
文書のみPublicationOnly キャッシュなしNot cached キャッシュなしNot cached
は executionandpublicationExecutionAndPublication キャッシュ済みCached キャッシュなしNot cached

適用対象

こちらもご覧ください