このページは役に立ちましたか。
このページのコンテンツについての ご意見をお待ちしております
その他にご意見はありますか。
残り 1500 文字
エクスポート (0) 印刷
すべて展開
情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

LazyThreadSafetyMode 列挙体

2013/12/12

System.Lazy(Of T) インスタンスが複数のスレッド間のアクセスを同期する方法を指定します。

Namespace:  System.Threading
アセンブリ:  mscorlib (mscorlib.dll 内)

'宣言
Public Enumeration LazyThreadSafetyMode

メンバー名説明
ExecutionAndPublicationロックは、シングル スレッドだけがスレッド セーフな方法で Lazy(Of T) インスタンスを初期化できるようにするために使用されます。初期化メソッド (初期化メソッドがない場合は既定のコンストラクター) がロックを内部的に使用すると、デッドロックが発生する可能性があります。初期化メソッド (valueFactory パラメーター) を指定する Lazy(Of T) コンストラクターを使用し、Lazy(Of T).Value プロパティを初めて呼び出したときにこの初期化メソッドが例外をスローした場合 (または例外を処理できない場合)、例外はキャッシュされ、再度 Lazy(Of T).Value プロパティが呼び出されたときに再びスローされます。初期化メソッドを指定しない Lazy(Of T) コンストラクターを使用する場合、T の既定のコンストラクターによってスローされる例外はキャッシュされません。その場合、後続の Lazy(Of T).Value プロパティ呼び出しで、Lazy(Of T) インスタンスを正常に初期化できます。初期化メソッドが Lazy(Of T) インスタンスの Value プロパティに再帰的にアクセスすると、InvalidOperationException がスローされます。
NoneLazy(Of T) インスタンスはスレッド セーフではありません。このインスタンスが複数のスレッドからアクセスされる場合の動作は未定義です。このモードは、高パフォーマンスが重要で、Lazy(Of T) インスタンスが複数のスレッドから初期化されないことが保証されている場合にのみ使用してください。初期化メソッド (valueFactory パラメーター) を指定する Lazy(Of T) コンストラクターを使用し、Lazy(Of T).Value プロパティを初めて呼び出したときにこの初期化メソッドが例外をスローした場合 (または例外を処理できない場合)、例外はキャッシュされ、再度 Lazy(Of T).Value プロパティが呼び出されたときに再びスローされます。初期化メソッドを指定しない Lazy(Of T) コンストラクターを使用する場合、T の既定のコンストラクターによってスローされる例外はキャッシュされません。その場合、後続の Lazy(Of T).Value プロパティ呼び出しで、Lazy(Of T) インスタンスを正常に初期化できます。初期化メソッドが Lazy(Of T) インスタンスの Value プロパティに再帰的にアクセスすると、InvalidOperationException がスローされます。
PublicationOnly複数のスレッドが同時に Lazy(Of T) インスタンスを初期化しようとすると、すべてのスレッドで初期化メソッド (初期化メソッドがない場合は既定のコンストラクター) の実行が許可されます。最初に初期化を完了したスレッドが Lazy(Of T) インスタンスの値を設定します。この値は、初期化メソッドを同時に実行していたその他すべてのスレッドに返されます。ただし、この初期化メソッドがそれらのスレッドで例外をスローする場合は除きます。競合するスレッドによって作成された T のインスタンスは破棄されます。初期化メソッドが任意のスレッドで例外をスローすると、その例外はスレッドの Lazy(Of T).Value プロパティ以外に反映されます。例外はキャッシュされません。IsValueCreated プロパティの値は false のままになります。その後、例外がスローされたスレッドまたは他のスレッドが Value プロパティを呼び出すと、初期化メソッドは再実行されます。初期化メソッドが Lazy(Of T) インスタンスの Value プロパティに再帰的にアクセスする場合、例外はスローされません。

この列挙体を使用して、Lazy(Of T) コンストラクターの mode パラメーターを指定します。すべてのコンストラクターがスレッドの同期に及ぼす影響は、それらが mode パラメーターを持つかどうかにかかわらず、この列挙体の観点から説明されています。

Lazy(Of T) インスタンスは、ユーザー指定の初期化メソッドまたは T の既定のコンストラクターによって初期化されます。初期化メソッドは、Lazy(Of T) コンストラクターの valueFactory パラメーターによって指定されます。このメソッドは、Lazy(Of T) のインスタンスによって遅延インスタンス化される型である T のインスタンスを返します。コンストラクターに valueFactory パラメーターがない場合は、T の既定のコンストラクターを使用して Lazy(Of T) インスタンスが初期化されます。どちらの場合でも、初めて Lazy(Of T).Value プロパティを呼び出すときに初期化が発生します。

Lazy(Of T) インスタンスのスレッド セーフの指定に加え、この列挙型は、例外のキャッシュに影響を及ぼします。Lazy(Of T) インスタンスについて例外がキャッシュされるとき、インスタンスを初期化できるのは 1 回だけです。Lazy(Of T).Value を初めて呼び出したときに例外がスローされた場合、例外はキャッシュされ、これ以降の Lazy(Of T).Value プロパティの呼び出しで再びスローされます。例外をキャッシュすることの利点は、エラーが発生しても、2 つのスレッドが常に同じ結果を得るという点です。

PublicationOnly モードを指定すると、例外はキャッシュされません。None または ExecutionAndPublication を指定すると、初期化メソッドを指定するか、既定のコンストラクターで T の使用を許可するかにより、キャッシュが行われるかどうかが決まります。初期化メソッドを指定すると、これら 2 つのモードで例外のキャッシュが有効になります。初期化メソッドは非常に簡単なものにできます。たとえば、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

表示:
© 2015 Microsoft