Delen via


Fouten en waarschuwingen met betrekking tot de lock instructie en threadsynchronisatie

Er zijn enkele fouten met betrekking tot de lock instructie en threadsynchronisatie:

  • CS0185: 'type' is geen referentietype zoals vereist voor de vergrendelingsinstructie.
  • CS1996: Kan niet wachten in de hoofdtekst van een vergrendelingsinstructie
  • CS9217: Een vergrendelingsinstructie voor een waarde van het type System.Threading.Lock kan niet worden gebruikt in asynchrone methoden of asynchrone lambda-expressies.

Daarnaast kan de compiler de volgende waarschuwing opleveren met betrekking tot lock instructies en threadsynchronisatie:

  • CS9216: Een waarde van het type System.Threading.Lock dat is geconverteerd naar een ander type, gebruikt waarschijnlijk onbedoelde vergrendeling op basis van bewaking.lock

vergrendelingsinstructiefouten

  • CS0185: 'type' is geen referentietype zoals vereist voor de vergrendelingsinstructie.
  • CS1996: Kan niet wachten in de hoofdtekst van een vergrendelingsinstructie
  • CS9217: Een vergrendelingsinstructie voor een waarde van het type System.Threading.Lock kan niet worden gebruikt in asynchrone methoden of asynchrone lambda-expressies.

Deze fouten geven aan dat uw code regels schendt met betrekking tot de lock instructie:

  • Het object dat wordt lockgenummerd, moet een verwijzingstype zijn. Waardetypen zijn niet toegestaan.
  • Een await expressie kan niet worden gebruikt in het bereik van een lock instructie.
  • De lock instructie kan niet worden gebruikt met async methoden of lambda-expressies. Voor deze fout kunt u het type object vervangen dat is vergrendeld door een ander type. De lock instructie maakt gebruik van de Monitor API.

U moet uw code bijwerken om de regels van de lock instructie te volgen.

vergrendelingswaarschuwing

  • CS9216: Een waarde van het type System.Threading.Lock dat is geconverteerd naar een ander type, gebruikt waarschijnlijk onbedoelde vergrendeling op basis van bewaking.lock

Vanaf C# 13 genereert de lock gespecialiseerde code wanneer het doelobject een System.Threading.Lock object is. De compiler genereert deze waarschuwing wanneer u een Lock object gebruikt, maar uw code converteert het type naar iets anders. Daarom genereert de compiler de algemene vergrendelingscode, niet de vergrendelingscode die specifiek is voor het Lock type. Voorbeeld:

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

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

Zorg ervoor dat de variabele of expressie het type van het Lock object vertegenwoordigt.