Share via


Fehler und Warnungen im Zusammenhang mit der lock-Anweisung und der Threadsynchronisierung

Es gibt einige Fehler im Zusammenhang mit der lock-Anweisung und der Threadsynchronisierung:

  • CS0185:„type“ ist kein Verweistyp, wie für die lock-Anweisung erforderlich.
  • CS1996:Kann nicht im Körper einer lock-Anweisung warten
  • CS9217:Eine lock-Anweisung für einen Wert vom Typ „System.Threading.Lock“ kann nicht in asynchronen Methoden oder asynchronen Lambdaausdrücken verwendet werden.

Darüber hinaus kann der Compiler die folgende Warnung im Zusammenhang mit lock-Anweisungen und Threadsynchronisierung generieren:

  • CS9216:Ein Wert vom Typ System.Threading.Lock, der in einen anderen Typ konvertiert wird, verwendet wahrscheinlich unbeabsichtigt die monitorbasierte Sperrung in der lock-Anweisung.

Fehler bei der lock-Anweisung

  • CS0185:„type“ ist kein Verweistyp, wie für die lock-Anweisung erforderlich.
  • CS1996:Kann nicht im Körper einer lock-Anweisung warten
  • CS9217:Eine lock-Anweisung für einen Wert vom Typ „System.Threading.Lock“ kann nicht in asynchronen Methoden oder asynchronen Lambdaausdrücken verwendet werden.

Diese Fehler deuten darauf hin, dass Ihr Code gegen Regeln für die lock-Anweisung verstößt:

  • Das Objekt, für das lock ausgeführt wird, muss ein Verweistyp sein. Werttypen sind nicht zulässig.
  • Ein await-Ausdruck kann nicht im Bereich einer lock-Anweisung verwendet werden.
  • Die lock-Anweisung kann nicht mit async-Methoden oder Lambdaausdrücken verwendet werden. Für diesen Fehler können Sie den Typ des gesperrten Objekts durch einen anderen Typ ersetzen. Die lock-Anweisung verwendet die Monitor-API.

Sie müssen Ihren Code so ändern, dass er den Regeln für die lock-Anweisung entspricht.

Warnungen bei der lock-Anweisung

  • CS9216:Ein Wert vom Typ System.Threading.Lock, der in einen anderen Typ konvertiert wird, verwendet wahrscheinlich unbeabsichtigt die monitorbasierte Sperrung in der lock-Anweisung.

Ab C# 13 generiert lock speziellen Code, wenn das Zielobjekt ein System.Threading.Lock-Objekt ist. Der Compiler generiert diese Warnung, wenn Sie ein Lock-Objekt verwenden, das von Ihrem Code aber in einen anderen Typ konvertiert wird. Daher generiert der Compiler den allgemeinen Sperrcode, nicht den spezifischen Sperrcode für den Typ Lock. Zum Beispiel:

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

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

Stellen Sie sicher, dass die Variable oder der Ausdruck den Typ des Lock-Objekts darstellt.