LazyThreadSafetyMode 列舉

定義

指定 Lazy<T> 執行個體如何同步處理多個執行緒進行的存取。

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

欄位

ExecutionAndPublication 2

使用鎖定來確保只有單一執行緒能夠以安全執行緒方式初始化 Lazy<T> 執行個體。 實際上,初始化方法會以安全線程的方式執行, (功能變數名稱) 中稱為 ExecutionPublication 初始化值的 也是安全線程,也就是說,所有線程只能發佈和使用一個值。 如果初始設定方法 (如果沒有初始設定方法,則為無參數建構函式) 在內部使用鎖定,則可能會發生死結。 如果您使用的 Lazy<T> 建構函式指定初始設定方法 (valueFactory 參數),而且當您初次呼叫 Value 屬性時,該初始設定方法擲回例外狀況 (或無法處理例外狀況),則會快取此例外狀況,並在後續呼叫 Value 屬性時再次擲回此例外狀況。 如果您使用未指定初始設定方法的 Lazy<T> 建構函式,則不會快取 T 的無參數建構函式所擲回例外狀況。 在此情況下,後續呼叫 Value 屬性可能會成功初始化 Lazy<T> 執行個體。 如果初始設定方法以遞迴方式存取 Lazy<T> 執行個體的 Value 屬性,則會擲回 InvalidOperationException

None 0

Lazy<T> 執行個體不是安全執行緒;如果從多個執行緒存取此執行個體,其行為未定義。 只有在高度重視效能且絕對不會從多個執行緒初始化 Lazy<T> 執行個體時,才能使用此模式。 如果您使用的 Lazy<T> 建構函式指定初始設定方法 (valueFactory 參數),而且當您初次呼叫 Value 屬性時,該初始設定方法擲回例外狀況 (或無法處理例外狀況),則會快取此例外狀況,並在後續呼叫 Value 屬性時再次擲回此例外狀況。 如果您使用未指定初始設定方法的 Lazy<T> 建構函式,則不會快取 T 的無參數建構函式所擲回例外狀況。 在此情況下,後續呼叫 Value 屬性可能會成功初始化 Lazy<T> 執行個體。 如果初始設定方法以遞迴方式存取 Lazy<T> 執行個體的 Value 屬性,則會擲回 InvalidOperationException

PublicationOnly 1

當多個執行緒同時嘗試初始化 Lazy<T> 執行個體時,所有執行緒可以執行初始設定方法 (如果沒有初始設定方法,則為無參數函式)。 第一個完成初始設定的執行緒會設定 Lazy<T> 執行個體的值。 這在 Publication 功能變數名稱中稱為 。 該值會傳回給任何其他同時執行初始設定方法的執行緒 (除非初始設定方法在這些執行緒上擲回例外狀況)。 由競爭執行緒所建立的任何 T 執行個體都會遭到捨棄。 實際上,初始化值的發行是安全線程,也就是說,所有線程只能發佈和使用其中一個初始化的值。 如果初始設定方法在任何執行緒上擲回例外狀況,該例外狀況會傳播至該執行緒上的 Value 屬性之外。 不會快取例外狀況。 IsValueCreated 屬性的值會保持為 false,且後續無論是由擲回例外狀況所在的執行緒或是其他執行緒呼叫 Value 屬性,都會再次執行初始設定方法。 如果初始設定方法以遞迴方式存取 Value 執行個體的 Lazy<T> 屬性,則不會擲回例外狀況。

備註

使用此列舉來指定建 mode 構函式的參數 Lazy<T> 。 執行緒同步處理上所有建構函式的效果都可以在此列舉中描述,不論它們是否具有 mode 參數。

Lazy<T>實例是由使用者指定的初始化方法或 的 T 無參數建構函式初始化。 初始化方法是由 valueFactory 建構函式的 Lazy<T> 參數所指定。 方法會傳回 的 T 實例,這是 實例所延遲具現化的 Lazy<T> 型別。 如果建構函式沒有 valueFactory 參數,則會使用 的 T 無參數建構函式來初始化 Lazy<T> 實例。 不論是哪一種情況,初始化會在您第一次呼叫 Lazy<T>.Value 屬性時發生。

除了指定實例的 Lazy<T> 執行緒安全性之外,此列舉也會影響例外狀況快取。 當實例的例外狀況快 Lazy<T> 取時,您只會有機會初始化實例。 如果您在第一次呼叫 Lazy<T>.Value 屬性時擲回例外狀況,該例外狀況會在所有後續呼叫 Lazy<T>.Value 屬性時快取並重新擲回。 快取例外狀況的優點是,即使發生錯誤,任何兩個執行緒一律都會得到相同的結果。

當您指定 PublicationOnly 模式時,永遠不會快取例外狀況。 當您指定 None 或 ExecutionAndPublication 時,快取取決於您指定初始化方法或允許使用的無參數建構 T 函式。 指定初始設定方法,可啟用這兩種模式的例外狀況快取。 初始設定方法可以非常簡單。 例如,它可能會針對 在 C# 或 New Lazy(Of Contents)(Function() New Contents()) Visual Basic 中呼叫 的 new Lazy<Contents>(() => new Contents(), mode) 無參數建構 T 函式。 如果您使用未指定初始化方法的建構函式,則不會快取 的無參數建構 T 函式擲回的例外狀況。 下表摘要說明例外狀況快取行為。

模式 使用初始化方法 針對 使用無參數建構函式 T
None 快取 不快取
PublicationOnly 不快取 不快取
ExecutionAndPublication 快取 不快取

適用於

另請參閱