tutorial navisworks español asp.net sql-server vb.net ajax concurrency

asp.net - tutorial - manual de navisworks 2018 en español pdf



Evitar que los usuarios trabajen en la misma fila (6)

¿Has intentado aumentar el tiempo entre las renovaciones? Esperaría que una vez cada 30 segundos fuera suficiente. 40 solicitudes / minuto es mucho menos carga que 1200 / minuto. Es posible que sus usuarios ni siquiera noten la diferencia.

Si lo hacen, ¿qué le parece proporcionar un botón de actualización en la página para que los usuarios puedan actualizar manualmente la lista justo antes de seleccionar un elemento para evitar el mensaje molesto si lo desean?

Tengo una aplicación web en el trabajo que es similar a un sistema de trabajo de tickets. Algunos usuarios ingresan nuevos problemas. Otros trabajadores eligen y resuelven problemas. Todos los datos se mantienen en MS SQL Server 2005.

Los usuarios que trabajan para resolver problemas van a una página donde pueden ver problemas abiertos. Debido a que hasta veinte personas pueden mirar esta página al mismo tiempo, un problema potencial que tuve que abordar fue qué sucede si alguien selecciona un problema que alguien más eligió justo después de cargar la página.

Para abordar esto, hice dos cosas. En primer lugar, la vista de cuadrícula que muestra los problemas para seleccionar utiliza un temporizador AJAX para actualizar cada segundo. Una vez que se ha seleccionado un problema, desaparece un segundo más tarde como máximo. En caso de que seleccionen uno dentro de este segundo, recibirán un mensaje pidiéndoles que elijan otro.

El problema es que la parte AJAX de esto está enviando demasiadas actualizaciones (esto es lo que asumo) y está afectando el rendimiento de la página y la base de datos. Además, las actualizaciones no se realizan cada segundo. Creo que el temporizador no es confiable cuando se trabaja para activar procedimientos almacenados.

Tiene que haber una mejor manera, pero parece que no puedo encontrar uno. ¿Alguien tiene experiencia con una situación como esta o tiene sugerencias para evitar que varios usuarios seleccionen el mismo registro para mantener? Realmente no quiero deshabilitar la parte AJAX por completo porque siento que el mensaje solo haría que la aplicación sea frustrante de usar.

Gracias,


Coloque un campo de marca de tiempo de bloqueo en la fila en la base de datos. Escriba un proceso almacenado que devuelva verdadero o falso si la marca de tiempo de expiración es anterior a un tiempo específico. Configure sus sesiones en su aplicación web para que expiren al mismo tiempo, uno o dos minutos. Cuando un usuario selecciona una fila, accede al proceso almacenado que ayuda a la aplicación a decidir si debe permitir que el usuario lo modifique.

Espero que tenga sentido ...


De ser posible, limite el sistema para que solo saquen el siguiente asunto abierto de la cola de trabajo en lugar de que puedan elegir entre todos los problemas abiertos.

Si eso no es posible, supongo que podría verificar la elección de un problema para ver si todavía está disponible. Si no está disponible, haz que desaparezca después de que el usuario haga clic en él. De esta forma, solo está solicitando cuando hacen clic en algo, en lugar de realizar un sondeo constante de los datos.


Hice algo similar donde una vez que un usuario abrió un ticket (fila) asignó ese ticket a ese usuario y estableció un valor en ese registro, como y FK para ese usuario en particular, por lo que si alguien más intentó abrir ese ticket (fila), les haría saber que ya ha sido asignado a otra persona.


Dos cosas pueden ayudar a mitigar su problema.

En primer lugar, se necesita una notificación de selección posterior de que el caso ha sido tomado, independientemente de su marco de tiempo de actualización de Ajax. Incluso consultar cada segundo no significa que dos personas no pueden hacer clic en el mismo caso en lo que perciben que es al mismo tiempo. En tales casos, uno de los usuarios debe ser notificado de que su selección no es válida, aunque parezca válida cuando se seleccione. Esta notificación no necesita ser elaborada; mantener un tono ligero y útil puede mejorar la percepción del usuario incluso a la luz de la decepción. Y si ya identifica al usuario que seleccionó ese registro, eso no solo ayudará a los usuarios a coordinar en el futuro, sino que también desviará la atención de su programa hacia el usuario que se encargó del caso. (de hecho, a la gerencia le puede gustar dar ocasionalmente a sus usuarios una colisión, ya que los motivará a seleccionar los casos más rápidamente)

En segundo lugar, un pequeño cambio en la forma de mostrar sus casos puede reducir las colisiones de selección. Agregar un elemento aleatorio para mostrar el orden y / o filtrar cada dos casos en la pantalla ayudará a los usuarios a seleccionar diferentes casos de forma natural. El reconocimiento de patrones humanos y la selección de tareas no son realmente aleatorios, por lo que pequeños cambios en la presentación pueden ser grandes cambios en el comportamiento de selección. Las reducciones en la probabilidad de colisión mantienen raras las notificaciones de colisión (y por lo tanto, son menos frustrantes para los usuarios). Esto es aún mejor si sus usuarios pueden separarse en clasificaciones que pueden ayudar a determinar el orden / filtro de caso útil.

De acuerdo, una tercera cosa que te ayudará con el tiempo es si mantienes un registro de cuándo se producen las colisiones (con metadatos útiles sobre la colisión, como quién estuvo involucrado y el momento de la selección). Armado con datos sólidos de colisión, puede encontrar lo que funciona y lo que no funciona. Con el tiempo, puede perfeccionar su aplicación a sus casos de uso reales, así como identificar problemas potenciales de manera temprana. Nada tranquiliza más a tus usuarios que estar a la cabeza de un problema (y poder explicar tus planes para resolverlo) incluso antes de que se den cuenta de que existe.

Con estos patrones mitigantes, probablemente encontrará que puede reducir de forma segura su tiempo de consulta de AJAX sin afectar la experiencia del usuario. Y con el registro útil, tendrá la seguridad de que cualquier ajuste que ponga en marcha realmente está funcionando (o no, lo que es incluso más útil saber).


Me falta ver el problema, especialmente después de que usted mencionó que ya está marcando las entradas como en proceso / manteniéndose y tiene una marca de tiempo / versión del artículo.

No es lo siguiente lo suficiente

  1. El usuario navega por los tickets y ve una lista de tickets disponibles, es decir, esto excluye los que están en el db en progreso. Si desea que los usuarios también vean los tickets en progreso, indíquelos claramente en el estado del ticket y desactive la opción para tomarlos.
  2. El usuario marca un ticket como en progreso explícita o implícitamente abriendo el ticket (depende de la experiencia del usuario / cómo se presenta a los usuarios).
  3. El usuario mueve el ticket explícitamente a un estado diferente, es decir, completado, no válido, a la espera de comentarios, etc.

Cuando los elementos se recuperan en 1, incluye una marca de tiempo / versión. Cuando ocurre 2, usa un enfoque de concurrencia optimista para asegurarse de que si 2 personas intentan actualizar el ticket al mismo tiempo, solo el primero tendrá éxito.

Lo que sucederá es que, para la segunda persona, la actualización ... donde ... timestamp = @timestamp no encontrará ningún registro para actualizar y usted informará que el ticket ya se tomó.

Si lo desea, puede compilar encima de lo anterior para actualizar la interfaz de usuario a medida que se seleccionan los tickets. Esto podría ser simplemente haciendo una actualización completa de la página actual de tickets después de x tiempo (tal vez alertando / solicitando al usuario), o incluso recuperando una lista de boletos cambiados para la página de boletos que se muestran con ajax. Aún tiene los pasos anteriores en su lugar, ya que esta modificación es solo una conveniencia para los usuarios.