共用方式為


Lock 類別

定義

注意

您必須在專案檔中將 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 之間的程式代碼區域是與鎖定相關聯的重要區段。 進入鎖定的線程稱為保留或擁有鎖定,直到其結束鎖定為止。 最多一個線程可以在任何指定時間保存鎖定。 線程可以保存多個鎖定。 線程可以在結束鎖定之前多次進入鎖定,例如遞歸。 無法立即輸入鎖定的線程可以等到可以輸入鎖定,或直到指定的逾時到期為止。

使用 EnterTryEnter 方法來輸入鎖定時:

  • 請確定線程會在例外狀況的情況下結束鎖定 Exit ,例如使用 區塊在 C# try/finally 中。
  • 在 C# async 方法中輸入並結束鎖定時,請確定進入和結束之間沒有 await 。 鎖定是由線程所保留,而下列程式 await 代碼可能會在不同的線程上執行。

建議使用 EnterScope 方法搭配語言建構,以自動處置傳回 Lock.Scope 的 ,例如 C# 關鍵詞,或使用 C# usinglock 關鍵詞,因為這些方法可確保在例外狀況下結束鎖定。 這些模式也可能具有使用 Enter/TryEnterExit的效能優勢。 下列代碼段說明輸入和結束鎖定的各種模式。

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輸入 L1L2T1嘗試輸入和等候、T2嘗試輸入L2L1和等候。 和 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)

嘗試輸入鎖定,視需要等候,直到可以輸入鎖定或直到指定的逾時到期為止。

適用於