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çãolock
.
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
lock
ed 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çãolock
. - A instrução
lock
não pode ser usada com métodosasync
ou expressões lambda. Para este erro, você pode substituir o tipo de objeto bloqueado por um tipo diferente. A instruçãolock
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çãolock
.
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
.