2010-09-08 8 views
5

Mantengo una aplicación web ASP.NET que hace que la conexión de red de un usuario se reinicie durante varios segundos cuando ejecuta un procedimiento. Por lo tanto, la solicitud de página agota el tiempo de espera del usuario, ya que nunca recibe la respuesta de la aplicación web (la conexión muere antes de recibir el paquete de respuesta).Async Function Thread.Sleep en la aplicación web

Para resolver esta situación, estaba contemplando que la página ASP.NET ejecute una función asincrónica que incorpora un Thread.Sleep(5000); // sleep for 5 seconds before executing the connection reset De esta manera, el navegador tiene 5 segundos para recibir la respuesta de la página antes de que se restablezca su conexión.

Tengo preocupaciones con el uso de Thread.Sleep y funciones asíncronas en ASP.NET embargo. Nunca he intentado hacerlo antes, así que no estoy seguro de los posibles problemas que puede causar. ¿Alguien ve problemas potenciales con el inicio de un hilo asincrónico que contiene un Thread.Sleep en una aplicación ASP.NET? Si es así, ¿puedes pensar en una mejor solución?

Respuesta

3

Colocar Thread.Sleep en un método asíncrono puede contribuir a la falta de ThreadPool, ya que bloquea uno de un número limitado de subprocesos durante varios segundos; dicho subproceso podría no responder a las solicitudes del cliente.

En su lugar, ¿por qué no crear un temporizador que se dispara después de cinco segundos? Mismo efecto, solo registre su trabajo retrasado en el evento del temporizador.

+0

¿Dispara el temporizador incluso si el objeto que lo referencia (en este caso, la página) está destruido? – regex

+1

Si la página que hace referencia a ella es recogida de basura, el temporizador también lo estará y no se disparará; necesitarás mantener una colección estática de temporizadores no vencidos para mantener una referencia fuerte. – FacticiusVir

+0

Buen punto: aunque a menudo no es una preocupación, el ThreadPool puede morir de hambre si todos los hilos están DORMIDOS, y entonces tu aplicación permanece inactiva, esperando a que los hilos se vuelvan a activar. – SqlRyan

1

Aunque considero que su enunciado de problema es demasiado impreciso para abordarlo correctamente, puedo decir que debe usar System.Threading.Timer en lugar de una instrucción Sleep. El primero es el rendimiento, este último mantendrá uno de los núcleos de su CPU en estado ocupado (¡muy mal!).

+1

Esto no es del todo exacto: los hilos que están durmiendo están marcados como Bloqueados y no consumirán tiempo de CPU. Sin embargo, está bloqueando un hilo sin ningún motivo, y ese * es * malo. – FacticiusVir

+0

Parece que hará que su cliente agote el tiempo de espera, independientemente de la forma en que realice un restablecimiento de la conexión. ¿Por qué no utilizar un bloqueo (Monitor.Pulse/Monitor.Wait) donde su subproceso ASP.NET hace una espera en dos eventos asincrónicos: hacer el procedimiento de negocio asíncrono y utilizar System.Threading.Timer. Tanto el procedimiento como el temporizador invocarán a Pulse. Si el temporizador gana, establece una bandera "tookTooLong", y su llamada ASP.NET puede regresar con gracia al cliente. Si el procedimiento gana, borra la bandera "tookTooLong". Entiendes la idea. –

+0

@FacticiusVir: Para varias aplicaciones "dormidas" que he visto, fue necesario eliminar declaraciones de suspensión para separar el uso de la CPU del 100% al 2%. –

1

En general, no es una buena idea poner el hilo a dormir en un servidor web, porque los hilos son limitados. En su caso específico necesita un cliente, iniciando ~ 1-2 solicitudes por segundo, para bloquear todos sus hilos ...

Debe utilizar un temporizador, como otros propusieron, y ofcource a AsyncPage/AsyncHttpHandler.