Lock 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
注意
您必須在專案檔中將 EnablePreviewFeatures
屬性設定為 True
,並啟用專案中的預覽功能,才能使用此預覽 API。 如需詳細資訊,請參閱 https://aka.ms/dotnet-preview-features。
提供機制,可在不同線程之間的程式代碼區域中達成相互排除。
public ref class Lock sealed
[System.Runtime.Versioning.RequiresPreviewFeatures]
public sealed class Lock
[<System.Runtime.Versioning.RequiresPreviewFeatures>]
type Lock = class
Public NotInheritable Class Lock
- 繼承
-
Lock
- 屬性
備註
類別 Lock 可用來定義需要進程線程之間互斥存取的程式代碼區域,通常稱為重要區段,以防止並行存取資源。 Lock
可以進入和結束,其中 enter 和 exit 之間的程式代碼區域是與鎖定相關聯的重要區段。 進入鎖定的線程稱為保留或擁有鎖定,直到其結束鎖定為止。 最多一個線程可以在任何指定時間保存鎖定。 線程可以保存多個鎖定。 線程可以在結束鎖定之前多次進入鎖定,例如遞歸。 無法立即輸入鎖定的線程可以等到可以輸入鎖定,或直到指定的逾時到期為止。
- 請確定線程會在例外狀況的情況下結束鎖定 Exit ,例如使用 區塊在 C#
try/finally
中。 - 在 C#
async
方法中輸入並結束鎖定時,請確定進入和結束之間沒有await
。 鎖定是由線程所保留,而下列程式await
代碼可能會在不同的線程上執行。
建議使用 EnterScope 方法搭配語言建構,以自動處置傳回 Lock.Scope 的 ,例如 C# 關鍵詞,或使用 C# using
lock
關鍵詞,因為這些方法可確保在例外狀況下結束鎖定。 這些模式也可能具有使用 Enter/TryEnter
和 Exit
的效能優勢。 下列代碼段說明輸入和結束鎖定的各種模式。
public sealed class ExampleDataStructure
{
private readonly Lock _lockObj = new();
public void Modify()
{
lock (_lockObj)
{
// Critical section associated with _lockObj
}
using (_lockObj.EnterScope())
{
// Critical section associated with _lockObj
}
_lockObj.Enter();
try
{
// Critical section associated with _lockObj
}
finally { _lockObj.Exit(); }
if (_lockObj.TryEnter())
{
try
{
// Critical section associated with _lockObj
}
finally { _lockObj.Exit(); }
}
}
}
使用 C# lock
關鍵詞或類似的輸入和結束鎖定時,表達式的類型必須精確 System.Threading.Lock
。 如果表達式的類型是其他任何專案,例如 或 Object
之類的 T
泛型類型,則可以改用無法交換的不同實作, (例如 Monitor) 。 如需詳細資訊,請參閱相關的編譯程序 規格。
Interrupt 可以中斷等候進入鎖定的線程。 在 Windows STA 線程上,等候鎖定允許訊息幫浦在等候期間在同一個線程上執行其他程式碼。 自訂 可以覆寫 SynchronizationContext等候的一些功能。
注意
進入鎖定的線程,包括遞歸等多次,必須結束鎖定的次數相同,才能完全結束鎖定,並允許其他線程進入鎖定。 如果線程在保留 Lock
時結束,則 的行為 Lock
會變成未定義。
警告
如果在程式代碼路徑上,線程可能會在結束之前輸入多個鎖定,請確定在相同線程上輸入任何兩個鎖定的所有程式代碼路徑都會以相同的順序輸入這些鎖定。 否則,可能會導致死結。 例如,假設在一個程式代碼路徑線程 T1
進入鎖定 L1
,然後在結束兩者之前鎖定 L2
,在另一個程式代碼路徑線程 T2
上會以反向順序輸入這兩個鎖定。 在該案例中,可能發生下列事件順序:T1
輸入 、T2
輸入 L1
L2
、T1
嘗試輸入和等候、T2
嘗試輸入L2
L1
和等候。 和 T2
之間T1
有無法解析的死結,而嘗試在未來輸入任一鎖定的任何其他線程也會停止回應。
建構函式
Lock() |
初始化 Lock 類別的新執行個體。 |
屬性
IsHeldByCurrentThread |
取得值,這個值表示鎖定是否由目前線程保留。 |
方法
Enter() |
輸入鎖定,視需要等候,直到可以輸入鎖定為止。 |
EnterScope() |
輸入鎖定,視需要等候,直到可以輸入鎖定為止。 |
Equals(Object) |
判斷指定的物件是否等於目前的物件。 (繼承來源 Object) |
Exit() |
結束鎖定。 |
GetHashCode() |
做為預設雜湊函式。 (繼承來源 Object) |
GetType() |
取得目前執行個體的 Type。 (繼承來源 Object) |
MemberwiseClone() |
建立目前 Object 的淺層複製。 (繼承來源 Object) |
ToString() |
傳回代表目前物件的字串。 (繼承來源 Object) |
TryEnter() |
嘗試在不等待的情況下輸入鎖定。 |
TryEnter(Int32) |
嘗試輸入鎖定,視需要等候指定的毫秒數,直到可以輸入鎖定為止。 |
TryEnter(TimeSpan) |
嘗試輸入鎖定,視需要等候,直到可以輸入鎖定或直到指定的逾時到期為止。 |