Udostępnij za pośrednictwem


Błędy i ostrzeżenia związane z instrukcją i synchronizacją lock wątków

Istnieje kilka błędów związanych z instrukcją i synchronizacją lock wątków:

  • CS0185: typ nie jest typem odwołania wymaganym przez instrukcję lock.
  • CS1996: Nie można oczekiwać w treści instrukcji lock
  • CS9217: Nie można używać instrukcji lock dla wartości typu "System.Threading.Lock" w metodach asynchronicznych ani asynchronicznych wyrażeniach lambda.

Ponadto kompilator może wygenerować następujące ostrzeżenie związane z lock instrukcjami i synchronizacją wątków:

  • CS9216: Wartość typu System.Threading.Lock przekonwertowana na inny typ będzie używać prawdopodobnie niezamierzonej blokady opartej na monitorze w lock instrukcji .

błędy instrukcji lock

  • CS0185: typ nie jest typem odwołania wymaganym przez instrukcję lock.
  • CS1996: Nie można oczekiwać w treści instrukcji lock
  • CS9217: Nie można używać instrukcji lock dla wartości typu "System.Threading.Lock" w metodach asynchronicznych ani asynchronicznych wyrażeniach lambda.

Te błędy wskazują, że kod narusza reguły dotyczące instrukcji lock :

  • Obiekt, który jest lockwdrażany, musi być typami referencyjnymi. Typy wartości nie są dozwolone.
  • Nie await można użyć wyrażenia w zakresie instrukcji lock .
  • Nie lock można używać instrukcji z metodami ani wyrażeniami async lambda. W przypadku tego błędu można zamienić typ obiektu zablokowanego na inny typ. Instrukcja lock używa interfejsu Monitor API.

Musisz zaktualizować kod, aby postępować zgodnie z regułami instrukcji lock .

ostrzeżenie o blokadzie

  • CS9216: Wartość typu System.Threading.Lock przekonwertowana na inny typ będzie używać prawdopodobnie niezamierzonej blokady opartej na monitorze w lock instrukcji .

Począwszy od języka C# 13, program generuje wyspecjalizowany kod, lock gdy obiekt docelowy jest obiektem System.Threading.Lock . Kompilator generuje to ostrzeżenie podczas korzystania z Lock obiektu, ale kod konwertuje jego typ na coś innego. W związku z tym kompilator generuje ogólny kod blokowania, a nie kod blokowania specyficzny dla Lock typu. Na przykład:

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

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

Upewnij się, że zmienna lub wyrażenie reprezentuje typ Lock obiektu.