共用方式為


lock 陳述式和執行緒同步相關的錯誤和警告

lock 陳述式和執行緒同步有一些相關錯誤

  • CS0185'type' 不是 lock 陳述式需要的參考型別。
  • CS1996無法在 lock 陳述式的主體中等候
  • CS9217無法在非同步方法或非同步 Lambda 運算式中使用 'System.Threading.Lock' 類型的 lock 陳述式。

此外,編譯器可能會產生下列與 lock 陳述式和執行緒同步相關的警告

  • CS9216轉換成不同型別的型別 System.Threading.Lock 值,在 lock 陳述式中可能會使用非預期的監視型鎖定。

lock 陳述式錯誤

  • CS0185'type' 不是 lock 陳述式需要的參考型別。
  • CS1996無法在 lock 陳述式的主體中等候
  • CS9217無法在非同步方法或非同步 Lambda 運算式中使用 'System.Threading.Lock' 類型的 lock 陳述式。

這些錯誤表示您的程式碼違反 lock 陳述式的相關規則:

  • 要執行 lock 的物件必須是參考型別。 不允許實值型別。
  • await 運算式不能用於 lock 陳述式的範圍。
  • lock 陳述式不能與 async 方法或 Lambda 運算式搭配使用。 針對此錯誤,您可以將鎖定的物件型別取代為不同型別。 lock 陳述式會使用 Monitor API。

您必須更新程式碼,以遵循 lock 陳述式的規則。

鎖定警告

  • CS9216轉換成不同型別的型別 System.Threading.Lock 值,在 lock 陳述式中可能會使用非預期的監視型鎖定。

從 C# 13 開始,當目標物件是 System.Threading.Lock 物件時,lock 會產生特殊化程式碼。 當您使用 Lock 物件時,編譯器會產生此警告,但您的程式碼會將其型別轉換為其他型別。 因此,編譯器會產生一般鎖定程式碼,而不是 Lock 型別特有的鎖定程式碼。 例如:

object lockObject = new System.Threading.Lock();

lock (lockObject) // CS9216
{
    // .. Your code
}

您應該確定變數或運算式代表 Lock 物件的型別。