Compartir a través de


Errores y advertencias relacionados con la instrucción lock y la sincronización de subprocesos

Hay algunos errores relacionados con la instrucción lock y la sincronización de subprocesos:

  • CS0185: 'type' no es un tipo de referencia según lo requiera la instrucción lock.
  • CS1996: No se puede esperar en el cuerpo de una instrucción lock
  • CS9217: Una instrucción lock en un valor de tipo "System.Threading.Lock" no se puede usar en métodos asincrónicos ni expresiones lambda asincrónicas.

Además, el compilador puede generar las siguientes advertencias relacionadas con las instrucciones lock y la sincronización de subprocesos:

  • CS9216: Un valor de tipo System.Threading.Lock convertido a otro tipo usará probablemente bloqueos no deseados basados en monitores en lock instrucción.

errores de instrucción lock

  • CS0185: 'type' no es un tipo de referencia según lo requiera la instrucción lock.
  • CS1996: No se puede esperar en el cuerpo de una instrucción lock
  • CS9217: Una instrucción lock en un valor de tipo "System.Threading.Lock" no se puede usar en métodos asincrónicos ni expresiones lambda asincrónicas.

Estos errores indican que el código infringe las reglas relativas a la; lock la instrucción:

  • El objeto que se va a lockcrear debe ser un tipo de referencia. No se permiten tipos de valor.
  • No se puede usar una expresión await en el ámbito de una instrucción lock.
  • La instrucción lock no se puede usar con async métodos o expresiones lambda. Para este error, puede reemplazar el tipo de objeto bloqueado por otro tipo. La instrucción lock usa la API de Monitor.

Debe actualizar el código para seguir las reglas de la instrucción lock.

advertencia de bloqueo

  • CS9216: Un valor de tipo System.Threading.Lock convertido a otro tipo usará probablemente bloqueos no deseados basados en monitores en lock instrucción.

A partir de C# 13, el lock genera código especializado cuando el objeto de destino es un objeto System.Threading.Lock. El compilador genera esta advertencia cuando se usa un objeto Lock, pero el código convierte su tipo en otra cosa. Por lo tanto, el compilador genera el código de bloqueo general, no el código de bloqueo específico del tipo Lock. Por ejemplo:

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

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

Debe asegurarse de que la variable o expresión representa el tipo del objeto Lock.