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 wlock
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
lock
wdrażany, musi być typami referencyjnymi. Typy wartości nie są dozwolone. - Nie
await
można użyć wyrażenia w zakresie instrukcjilock
. - Nie
lock
można używać instrukcji z metodami ani wyrażeniamiasync
lambda. W przypadku tego błędu można zamienić typ obiektu zablokowanego na inny typ. Instrukcjalock
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 wlock
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.