Este artigo é um artigo espelhado de tradução automática, por favor clique aqui para ir para o artigo original.

Vista: 49134|Resposta: 4

[Fonte] .NET/C# Lock Principle Monitor fornece uma explicação detalhada

[Copiar link]
Publicado em 29/04/2021 09:54:10 | | | |
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:

.net/c# bloqueio de concorrência multithread do usuário (string){...} Explicação detalhada
https://www.itsvse.com/thread-7764-1-1.html

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)





Anterior:(to).NET/C# para empacotar a pasta em um arquivo zip
Próximo:O Redis usa scripts Lua para explicações detalhadas
 Senhorio| Publicado em 10/02/2022 09:20:09 |

Não solte a fechadura





 Senhorio| Publicado em 25/06/2023 19:57:43 |
O método de sincronização de objetos era chamado a partir de um bloco de código não sincronizado.
O código a seguir dará um erro conforme acima, como




 Senhorio| Publicado em 12/08/2023 19:47:49 |
Açúcar com sintaxe de bloqueio, como mostrado abaixo:






 Senhorio| Publicado em 11/07/2024 10:44:02 |
【Turn】C# concorrência multithread sob vários bloqueios
https://www.itsvse.com/thread-10561-1-1.html
Disclaimer:
Todo software, material de programação ou artigos publicados pela Code Farmer Network são apenas para fins de aprendizado e pesquisa; O conteúdo acima não deve ser usado para fins comerciais ou ilegais, caso contrário, os usuários terão todas as consequências. As informações deste site vêm da Internet, e disputas de direitos autorais não têm nada a ver com este site. Você deve deletar completamente o conteúdo acima do seu computador em até 24 horas após o download. Se você gosta do programa, por favor, apoie um software genuíno, compre o registro e obtenha serviços genuínos melhores. Se houver qualquer infração, por favor, entre em contato conosco por e-mail.

Mail To:help@itsvse.com