Este artículo es un artículo espejo de traducción automática, por favor haga clic aquí para saltar al artículo original.

Vista: 193519|Respuesta: 11

[Fuente] .net/c# bloqueo de concurrencia multihilo de usuario (string){...} Explicación detallada

[Copiar enlace]
Publicado en 3/7/2019 15:25:19 | | | |
Escenarios comunes de mal uso: Para evitar pagos duplicados de pedidos causados por usuarios que accidentalmente pulsan el botón de pago varias veces, usamos el bloqueo (número de pedido) para asegurarnos de que solo un hilo pueda realizar la operación en el pedido.

Esta idea es buena, al menos mejor que el lock (un objeto estático privado para procesar clases), porque el efecto del número de orden de bloqueo es bloquear solo la operación del orden actual 1, y si la variable estática de bloqueo, es decir, bloquear todas las órdenes, hará que todas las órdenes se pongan en cola, lo cual es obviamente irrazonable.

¿Puede el método del candado (número de pedido) mencionado al principio de este artículo lograr el efecto deseado? Vamos a usar algo de código para restaurar el escenario de uso primero.

Si ignoras la información del usuario y otras validaciones, el código se ve más o menos así:
Para la palabra clave de candado, MSDN incluye información que se puede encontrar en Baidu, y parece que se recomienda no usar lock (string), y la razón es la misma. El siguiente pasaje está tomado del consejo de MSDN sobre las cuerdas de los candados:

El problema del lock("miLock") ocurre porque cualquier otro código que use la misma cadena en el proceso compartirá el mismo bloqueo.
Esta frase oculta un mecanismo enorme, es decir, "la misma cadena".

¿Qué es "la misma cuerda"? Consulta el código:


¿Son str1 y str2 la misma cuerda de arriba? La respuesta es SÍ.

Ver de nuevo:


¿Siguen siendo la fuerza 1 y la 2 superior la misma cuerda? La respuesta es NO.

Vale, volvamos al tema del pago del pedido. En nuestro código, lock(orderNumber), cuando el usuario hace clic accidentalmente unas cuantas veces más tras deslizar la mano, ¿el número de orden que introduce esta acción es la misma cadena cada vez? La respuesta es NO. Esto es decir

El código que gestiona el pedido anterior no actúa realmente como un bloqueo.

De hecho, existen dos tipos de comparaciones de cadenas, véase el código:


La primera línea del código anterior genera True, y la segunda línea produce False. Creo que entiendes lo que MSDN significa con "la misma cadena" sin que yo te explique.

La mejor solución

Soluciones para cuerdas de bloqueo óptimas:





Código de demostración:




En la web, a veces se puede usar una variable global; esta variable global, cuando varios usuarios acceden al mismo tiempo, puede parecer anormal; en este momento, establecemos un bloqueo global, pero la desventaja es que todos los accesos esperarán por turnos.

En algunos casos, por ejemplo, el mismo usuario solo puede comentar una vez en 15 segundos; si se usa el bloqueo global, la función de comentarios será muy lenta de procesar cuando el número de usuarios aumente, lo que afectará mucho a la experiencia del usuario.

En este momento,Podemos establecer el bloqueo para cada usuario individualmente, lock(string){...}, y el nombre del lock puede definirse como:Nombre del método + ID de usuarioDe este modo, cada usuario tiene un bloqueo independiente y, al juzgar el intervalo de comentarios, no afectará a los comentarios de otros usuarios.

(Fin)




Anterior:Tipografía LPSTR de MFC
Próximo:Obviamente OpenSSL ha sido actualizado, ¿Apache sigue mostrando la versión antigua?
Publicado en 13/5/2022 14:27:17 |
¿Puede el método del candado (número de pedido) mencionado al principio de este artículo lograr el efecto deseado? Vamos a usar algo de código para restaurar el escenario de uso primero.
 Propietario| Publicado en 12/8/2023 19:48:15 |
.NET/C# Lock Principle Monitor ofrece una explicación detallada
https://www.itsvse.com/thread-9633-1-1.html
Publicado en 7/1/2023 11:22:02 |
También me la encontré en mi práctica laboral, gracias al autor por este artículo técnico
Publicado en 3/7/2019 20:02:32 |
Esto está muy bien
Publicado en 18/6/2021 14:24:43 |
Lo que se muestra en la página es que el código no puede verse
Publicado en 29/6/2021 0:21:16 |
Mira el código
Publicado en 29/6/2021 0:54:24 |
No puedo ver el código
Publicado en 14/5/2022 10:06:46 |
Aprende a aprender
Publicado en 28/5/2022 22:03:59 |
Muy bien, aprendido
Publicado en 28/11/2022 21:46:47 |
¿Se puede usar asp.net usarse?
Renuncia:
Todo el software, materiales de programación o artículos publicados por Code Farmer Network son únicamente para fines de aprendizaje e investigación; El contenido anterior no se utilizará con fines comerciales o ilegales; de lo contrario, los usuarios asumirán todas las consecuencias. La información de este sitio proviene de Internet, y las disputas de derechos de autor no tienen nada que ver con este sitio. Debes eliminar completamente el contenido anterior de tu ordenador en un plazo de 24 horas desde la descarga. Si te gusta el programa, por favor apoya el software genuino, compra el registro y obtén mejores servicios genuinos. Si hay alguna infracción, por favor contáctanos por correo electrónico.

Mail To:help@itsvse.com