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

Vista: 193519|Resposta: 11

[Fonte] .net/c# bloqueio de concorrência multithread do usuário (string){...} Explicação detalhada

[Copiar link]
Publicado em 03/07/2019 15:25:19 | | | |
Cenários comuns de uso indevido: Para evitar pagamentos duplicados de pedidos causados por usuários clicando acidentalmente no botão de pagamento várias vezes, usamos o lock (número do pedido) para garantir que apenas um fio fio possa realizar a operação no pedido.

Essa ideia é boa, pelo menos melhor que lock (um objeto estático privado para processamento de classes), porque o efeito do número de ordem de travamento é travar apenas a operação da ordem 1 atual, e se a variável estática de bloqueio for bloqueada para todas as ordens, fará com que todas as ordens fiquem em fila, o que é obviamente irrazoável.

Então, o método do número do pedido (lock) mencionado no início deste artigo pode alcançar o efeito desejado? Vamos usar um pouco de código para restaurar o cenário de uso primeiro.

Se você ignorar informações do usuário e outras validações, o código fica basicamente assim:
Para a palavra-chave lock, MSDN inclui informações que podem ser encontradas no Baidu, e parece que é recomendado não usar lock (string), e o motivo é o mesmo. O trecho a seguir é retirado do conselho da MSDN sobre cordões de fechadura:

O problema do lock ("meuLock") ocorre porque qualquer outro código usando a mesma string no processo compartilhará o mesmo lock.
Essa frase esconde um mecanismo enorme, que é, "a mesma cadeia".

O que é "a mesma corda"? Veja o código:


Str1 e str2 são a mesma corda acima? A resposta é SIM.

Veja novamente:


Str1 e str2 acima ainda são a mesma corda? A resposta é NÃO.

Ok, vamos voltar à questão do pagamento do nosso pedido. No nosso código, lock(orderNumber), quando o usuário clica acidentalmente mais algumas vezes após passar a mão, o orderNumber que digita essa ação é a mesma cadeia a cada vez? A resposta é NÃO. Ou seja,

O código que lida com a ordem acima não funciona como um bloqueio.

Na verdade, existem dois tipos de comparações de strings, veja o código:


A primeira linha do código acima gera Verdadeiro, e a segunda linha gera Falso. Acredito que você entende o que MSDN quer dizer com "a mesma cadeia" sem minha explicação.

A melhor solução

Soluções para cadeias de travamento ótimas:





Código de demonstração:




No site, às vezes uma variável global pode ser usada; essa variável global, quando vários usuários acessam ao mesmo tempo, pode parecer anormal; nesse momento, vamos definir um bloqueio global, mas a desvantagem disso é que todos os acessos aguardam por turno.

Em alguns cenários, por exemplo, o mesmo usuário só pode comentar uma vez em 15 segundos; se o bloqueio global for usado, a função de comentário será muito lenta para processar quando o número de usuários aumentar, o que afetará muito a experiência do usuário.

Neste momento,Podemos definir o bloqueio para cada usuário individualmente, lock(string){...}, e o nome do lock pode ser definido como:Nome do método + ID do usuárioDessa forma, cada usuário tem um bloqueio independente e, ao avaliar o intervalo de comentários, ele não afetará os comentários dos outros usuários.

(Fim)




Anterior:Escrita tipográfica LPSTR do MFC
Próximo:O OpenSSL obviamente foi atualizado, o Apache ainda apresenta a versão antiga?
Publicado em 13/05/2022 14:27:17 |
Então, o método do número do pedido (lock) mencionado no início deste artigo pode alcançar o efeito desejado? Vamos usar um pouco de código para restaurar o cenário de uso primeiro.
 Senhorio| Publicado em 12/08/2023 19:48:15 |
.NET/C# Lock Principle Monitor fornece uma explicação detalhada
https://www.itsvse.com/thread-9633-1-1.html
Publicado em 07/01/2023 11:22:02 |
Também encontrei isso na minha prática profissional, graças ao autor deste artigo técnico
Publicado em 03/07/2019 20:02:32 |
Isso é coisa boa
Publicado em 18/06/2021 14:24:43 |
O que é mostrado na página é que o código não pode ser visualizado
Publicado em 29/06/2021 00:21:16 |
Olhe o código
Publicado em 29/06/2021 00:54:24 |
Não consigo ver o código
Publicado em 14/05/2022 10:06:46 |
Aprenda a aprender
Publicado em 28/05/2022 22:03:59 |
Muito bem, aprendi
Publicado em 28/11/2022 21:46:47 |
Pode asp.net ser usado?
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