次の方法で共有


LazyThreadSafetyMode 列挙型

定義

Lazy<T> インスタンスが複数のスレッド間でアクセスを同期する方法を指定します。

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

フィールド

ExecutionAndPublication 2

ロックを使って確実に 1 つのスレッドのみが Lazy<T> インスタンスをスレッド セーフな方法で初期化します。 事実上、初期化メソッドはスレッド セーフな方法 (フィールド名と呼ばれます) で実行されます ExecutionPublication また、初期化された値の 1 つの値のみがすべてのスレッドによって公開および使用されるという意味でもスレッド セーフです。 初期化メソッド (初期化メソッドがない場合は、パラメーターなしのコンストラクター) は内部でロックを使うため、デッドロックが発生することがあります。 初期化メソッドを指定した (valueFactory パラメーター) Lazy<T> コンストラクターを使った場合に、Value プロパティを初回に呼び出したときに初期化メソッドが例外をスローした (または例外のハンドルに失敗した) 場合、その例外はキャッシュされ、それ以降に Value プロパティを呼び出した時点で再度スローされます。 初期化メソッドを指定しない Lazy<T> コンストラクターを使用する場合、T についてパラメーターなしのコンストラクターからスローされる例外はキャッシュされません。 その場合、Value プロパティへの後続の呼び出しで Lazy<T> インスタンスが正常に初期化される可能性があります。 初期化メソッドが Lazy<T> インスタンスの Value プロパティに再帰的にアクセスすると、InvalidOperationException がスローされます。

None 0

Lazy<T> インスタンスはスレッド セーフではありません。インスタンスに複数のスレッドからアクセスした場合の動作は未定義です。 高いパフォーマンスが重要であり、Lazy<T> インスタンスが複数のスレッドから初期化されないことが保証されている場合にのみ、このモードを使ってください。 初期化メソッドを指定した (valueFactory パラメーター) Lazy<T> コンストラクターを使った場合に、Value プロパティを初回に呼び出したときに初期化メソッドが例外をスローした (または例外のハンドルに失敗した) 場合、その例外はキャッシュされ、それ以降に Value プロパティを呼び出した時点で再度スローされます。 初期化メソッドを指定しない Lazy<T> コンストラクターを使用する場合、T についてパラメーターなしのコンストラクターからスローされる例外はキャッシュされません。 その場合、Value プロパティへの後続の呼び出しで Lazy<T> インスタンスが正常に初期化される可能性があります。 初期化メソッドが Lazy<T> インスタンスの Value プロパティに再帰的にアクセスすると、InvalidOperationException がスローされます。

PublicationOnly 1

複数のスレッドで Lazy<T> のインスタンスを同時に初期化しようとすると、すべてのスレッドで初期化メソッド (または、初期化メソッドが存在しない場合はパラメーターなしのコンストラクター) の実行が許可されます。 初期化を最初に完了したスレッドが、Lazy<T> インスタンスの値を設定します。 これはフィールド名と呼ばれます Publication 。 初期化メソッドを同時に実行したその他のスレッドには、その値が返されます。ただし、それらのスレッドで初期化メソッドが例外をスローした場合を除きます。 競合するスレッドによって作成された T のインスタンスは、すべて破棄されます。 実質的には、初期化された値のパブリケーションは、初期化された値の 1 つだけがすべてのスレッドによって発行および使用されるという意味でスレッド セーフです。 いずれかのスレッドで初期化メソッドが例外をスローした場合、その例外はそのスレッドの Value プロパティの外に伝達されます。 例外はキャッシュされません。 IsValueCreated プロパティの値は false のままになります。その後、例外がスローされたスレッドまたは他のスレッドが Value プロパティを呼び出すと、初期化メソッドは再実行されます。 初期化メソッドが Value インスタンスの Lazy<T> プロパティに再帰的にアクセスしても、例外はスローされません。

注釈

コンストラクターのLazy<T>パラメーターを指定するには、この列挙体をmode使用します。 スレッド同期に対するすべてのコンストラクターの影響は、パラメーターがあるかどうかに関係なく mode 、この列挙の観点から説明できます。

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

この列挙は、インスタンスのスレッド セーフを Lazy<T> 指定するだけでなく、例外キャッシュにも影響します。 インスタンスに対して Lazy<T> 例外がキャッシュされている場合、インスタンスを初期化する機会は 1 つだけです。 プロパティを初めて呼び出 Lazy<T>.Value すと例外がスローされた場合、その例外はキャッシュされ、以降のすべてのプロパティ呼び出しで Lazy<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
なし キャッシュ済み キャッシュなし
PublicationOnly キャッシュなし キャッシュなし
ExecutionAndPublication キャッシュ済み キャッシュなし

適用対象

こちらもご覧ください