閱讀英文版本

分享方式:


LazyThreadSafetyMode 列舉

定義

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

C#
public enum LazyThreadSafetyMode
繼承
LazyThreadSafetyMode

欄位

名稱 Description
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 快取 不快取

適用於

產品 版本
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

另請參閱