與 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
物件的型別。