Condividi tramite


Errori e avvisi correlati all'istruzione lock e alla sincronizzazione dei thread

Esistono alcuni errori correlati all'istruzione lock e alla sincronizzazione dei thread:

  • CS0185: 'type' non è un tipo riferimento richiesto dall'istruzione lock.
  • CS1996: Non è possibile includere un elemento await nel corpo di un'istruzione lock
  • CS9217: Un'istruzione lock su un valore di tipo 'System.Threading.Lock' non può essere usata nei metodi asincroni o nelle espressioni lambda asincrone.

Inoltre, il compilatore potrebbe generare il seguente avviso correlato alle istruzioni lock e alla sincronizzazione dei thread:

  • CS9216: Un valore di tipo System.Threading.Lock convertito in un tipo diverso userà probabilmente un blocco basato sul monitoraggio imprevisto nell'istruzione lock.

errori di istruzione lock

  • CS0185: 'type' non è un tipo riferimento richiesto dall'istruzione lock.
  • CS1996: Non è possibile includere un elemento await nel corpo di un'istruzione lock
  • CS9217: Un'istruzione lock su un valore di tipo 'System.Threading.Lock' non può essere usato in metodi asincroni o espressioni lambda asincroni.

Questi errori indicano che il codice viola le regole relative all'istruzione lock:

  • L'oggetto locked deve essere un tipo riferimento. I tipi valore non sono consentiti.
  • Un'espressione await non può essere usata nell'ambito di un'istruzione lock.
  • L'istruzione lock non può essere usata con async metodi o espressioni lambda. Per questo errore, è possibile sostituire il tipo di oggetto bloccato con un tipo diverso. L'istruzione lock usa l'API Monitor.

È necessario aggiornare il codice per seguire le regole dell'istruzione lock.

avviso di blocco

  • CS9216: Un valore di tipo System.Threading.Lock convertito in un tipo diverso userà probabilmente un blocco basato sul monitoraggio imprevisto nell'istruzione lock.

A partire da C# 13, il lock genera un codice specializzato quando l'oggetto di destinazione è un oggetto System.Threading.Lock. Il compilatore genera questo avviso quando si usa un oggetto Lock, ma il codice converte il suo tipo in un altro. Di conseguenza, il compilatore genera il codice di blocco generale, non il codice di blocco specifico del tipo Lock. Ad esempio:

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

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

È necessario assicurarsi che la variabile o l'espressione rappresenti il tipo dell'oggetto Lock.