Compartilhar via


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

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

  • CS0185: "type" não é um tipo de referência, conforme exigido pela instrução lock.
  • CS1996: Não é possível aguardar no corpo de uma instrução lock
  • 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 instruções lock e sincronização de thread:

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

erros de instrução lock

  • CS0185: "type" não é um tipo de referência, conforme exigido pela instrução lock.
  • CS1996: Não é possível aguardar 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 o código viola as regras relativas à instrução lock:

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

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

aviso de bloqueio

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

A partir do C# 13, o lock gera código especializado quando o objeto de destino é um objeto System.Threading.Lock. O compilador gera este aviso quando você está usando um objeto Lock, mas o 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 tipo Lock. 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 objeto Lock.