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 default 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 default 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 default 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 default 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. 初期化メソッドが Lazy<T> インスタンスの Value プロパティに再帰的にアクセスしても、例外はスローされません。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.

ALazy<T>初期化のユーザーが指定したメソッドまたはの既定のコンス トラクターのいずれかのインスタンスの初期化Tします。A Lazy<T> instance is initialized either by a user-specified initialization method or by the default 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 default 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.

PublicationOnly モードを指定すると、例外はキャッシュされません。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 default 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 に既定のコンストラクターを呼び出すことができます。C# の場合は new Lazy<Contents>(() => new Contents(), mode)、Visual Basic の場合は New Lazy(Of Contents)(Function() New Contents()) です。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. 既定のコンス トラクターからスローされる例外で、初期化メソッドを指定していないコンス トラクターを使用するかどうかはTはキャッシュされません。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 既定のコンス トラクターを使用します。 TUsing default constructor for T
なしNone キャッシュ済みCached キャッシュされていません。Not cached
PublicationOnlyPublicationOnly キャッシュされていません。Not cached キャッシュされていません。Not cached
ExecutionAndPublicationExecutionAndPublication キャッシュ済みCached キャッシュされていません。Not cached

適用対象

こちらもご覧ください