Partilhar via


Erros e avisos relacionados à instrução e à lock sincronização de threads

Há alguns erros relacionados à instrução e à lock sincronização de threads:

  • CS0185: 'type' não é um tipo de referência conforme exigido pela instrução lock.
  • CS1996: Não é possível esperar no corpo de uma instrução de bloqueio
  • CS9217: Uma instrução lock em um valor do tipo 'System.Threading.Lock' não pode ser usada em métodos assíncronos ou expressões lambda assíncronas.

Além disso, o compilador pode produzir o seguinte aviso relacionado a lock instruções e sincronização de threads:

  • CS9216: Um valor do tipo System.Threading.Lock convertido para um tipo diferente usará provavelmente o bloqueio não intencional baseado em monitor na lock instrução.

Erros de instrução de bloqueio

  • CS0185: 'type' não é um tipo de referência conforme exigido pela instrução lock.
  • CS1996: Não é possível esperar no corpo de uma instrução de bloqueio
  • CS9217: Uma instrução lock em um valor do tipo 'System.Threading.Lock' não pode ser usada em métodos assíncronos ou expressões lambda assíncronas.

Esses erros indicam que seu código viola as regras relativas à lock instrução:

  • O objeto que está sendo locked deve ser um tipo de referência. Os tipos de valor não são permitidos.
  • Uma await expressão não pode ser usada no escopo de uma lock instrução.
  • A lock instrução não pode ser usada com async métodos ou expressões lambda. Para esse erro, você pode substituir o tipo de objeto bloqueado por um tipo diferente. A lock instrução usa a Monitor API.

Você deve atualizar seu código para seguir as regras da lock declaração.

aviso de bloqueio

  • CS9216: Um valor do tipo System.Threading.Lock convertido para um tipo diferente usará provavelmente o bloqueio não intencional baseado em monitor na lock instrução.

A partir do C# 13, o lock gera código especializado quando o objeto de destino é um System.Threading.Lock objeto. O compilador gera esse aviso quando você está usando um Lock objeto, mas seu código converte seu tipo em outra coisa. Portanto, o compilador gera o código de bloqueio geral, não o código de bloqueio específico para o Lock tipo. Por exemplo:

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

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

Você deve garantir que a variável ou expressão represente o tipo do Lock objeto.