A instrução lock pega o mutex de um determinado objeto, executa um bloco de instrução e então libera o lock. Ao segurar um cadeado, o rosco que segura o cadeado pode adquirir e soltar o cadeado novamente. Qualquer outra linha é bloqueada para conseguir a trava e espera até que a trava seja liberada.
Revisar:
Use o código de fechadura
Equivalente a
Pode-se pensar que o código subjacente do Lock é implementado pelo Monitor.
Já que o código usa try... finalblock, então mesmo que uma exceção seja lançada no corpo da instrução lock, o lock é liberado.
Você não pode usar o bloqueio de operador await no corpo da instrução.Você não pode usá-lo no corpo da declaraçãoEspereBloqueio de operador。 Você não pode usar o bloqueio de operador await no corpo da instrução. Você não pode usar o bloqueio de operador await no corpo da instrução. Essa frase é muito importante!
Documentação:O login do hiperlink está visível.
Eu mesmo testado o código,Use Tarefa para conseguir o bloqueio e use Await para bloquear, o código é o seguinte:
Após executar o código a seguir várias vezes, o resultado da execução não é o esperado.
Por quê? Se você tentar usar a palavra-chave await ao tentar usar a palavra-chave await no bloco de bloqueio, você terá este erro de compilação: cannot await no corpo de uma instrução de lock. O motivo é que, após a conclusão do await, o método pode rodar em uma thread diferente em vez da thread (thread chamando) antes da palavra-chave await.palavra-chave lock.mesmo fioPegar o travado e soltar o cadeado dentro do cadeado。 Modifique o código para ver o motivo de forma mais intuitiva:
Obtenha o ID da rosca da trava e o ID da rosca da liberação da trava,Obviamente não está em nenhum tópico, de modo que a trava não pode ser liberada com sucesso, como mostrado na figura abaixo:
Tentei modificar o código, testei com thread, executei várias vezes e funcionou como esperado, o código é o seguinte:
(Fim)
|