Hilo de BackgroundWorker en ASP.NET

¿Es posible utilizar el hilo BackGroundWorker en ASP.NET 2.0 para la siguiente situación, de modo que el usuario al final del navegador no tenga que esperar mucho tiempo?

Guión

  1. El navegador solicita una página, digamos SendEmails.aspx
  2. La página SendEmails.aspx crea un hilo de BackgroundWorker y proporciona al hilo el contexto suficiente para crear y enviar correos electrónicos.
  3. El navegador recibe la respuesta de ComposeAndSendEmails.aspx y dice que se están enviando correos electrónicos.
  4. Mientras tanto, el hilo de fondo se dedica a un proceso de creación y envío de correos electrónicos que podría tomar un tiempo considerable para completar.

Mi principal preocupación es mantener el hilo de BackgroundWorker ejecutándose, intentando enviar, digamos 50 correos electrónicos, mientras que el hilo de threadprocessprocessprocess de ASP.NET ha desaparecido.

Si no desea utilizar las bibliotecas AJAX, o el procesamiento del correo electrónico es REALMENTE largo y podría agotar el tiempo de espera de una solicitud AJAX estándar, puede utilizar un método AsynchronousPostBack que era el “viejo truco” en .net 1.1 días.

Básicamente, lo que debe hacer es hacer que su botón de envío comience el procesamiento del correo electrónico en un estado asíncrono, mientras que el usuario es llevado a una página intermedia. El beneficio de esto es que puede hacer que su página intermedia se actualice tanto como sea necesario, sin preocuparse por alcanzar los tiempos de espera estándar.

Cuando se completa el proceso de fondo, pondrá un pequeño indicador de “hecho” en la base de datos / variable de aplicación / lo que sea. Cuando su página intermedia realiza una actualización de sí misma, detecta esta bandera y redirige automáticamente al usuario a la página “finalizada”.

Una vez más, AJAX hace todo esto discutible, pero si por alguna razón tiene un proceso muy intenso u oportuno que tiene que hacerse en la web, esta solución funcionará para usted. Encontré un buen tutorial aquí y hay muchos más por ahí.

Tuve que usar un proceso como este cuando estábamos trabajando en una aplicación tipo “web check-in” que interactuaba con una aplicación de un tercero y su API de importación era terriblemente lenta.

EDITAR: ¡GAH! Te maldigo Guzlar y tus habilidades de mecanorar como Dios 8 ^ D.

No debe hacer ningún subproceso desde páginas ASP.NET. Cualquier hilo que se ejecute durante mucho tiempo corre el peligro de desaparecer cuando el proceso de trabajo se recicla. No puedes predecir cuándo sucederá esto. Cualquier proceso de larga duración debe ser manejado por un servicio de Windows. Puede iniciar estos procesos dejando caer un mensaje en MSMQ, por ejemplo.

ThreadPool.QueueUserWorkItem(delegateThatSendsEmails) 

o en System.Net.Mail.SmtpServer use el método SendAsync.

Desea poner el código de envío de correo electrónico en otro hilo, porque devolverá al usuario inmediatamente y lo procesará, sin importar cuánto tiempo lleve.

Es posible. Una vez que inicie un nuevo hilo de forma asincrónica desde la página, la solicitud de la página continuará y enviará la página al usuario. El subproceso asíncrono continuará ejecutándose en el servidor, pero ya no tendrá acceso a la sesión.

Si tiene que mostrar el progreso de la tarea, considere algunas técnicas de Ajax.

Lo que debe usar para este escenario es Asynchronous Pages, una característica que se agregó en ASP.NET 2.0

Las páginas asíncronas ofrecen una solución clara a los problemas causados ​​por las solicitudes vinculadas a E / S. El procesamiento de página comienza en una cadena de subprocesos, pero esa cadena se devuelve al grupo de subprocesos una vez que se inicia una operación de E / S asincrónica en respuesta a una señal de ASP.NET. Cuando la operación finaliza, ASP.NET toma otro subproceso del grupo de subprocesos y finaliza el procesamiento de la solicitud. La escalabilidad aumenta porque los subprocesos del grupo de subprocesos se utilizan de manera más eficiente. Los subprocesos que de otro modo estarían bloqueados esperando a que se complete la E / S ahora se pueden usar para atender otras solicitudes. Los beneficiarios directos son solicitudes que no realizan operaciones de E / S prolongadas y, por lo tanto, pueden entrar y salir rápidamente de la cartera de proyectos. Largas esperas para entrar en la tubería tienen un impacto desproporcionadamente negativo en el desempeño de tales solicitudes.

http://msdn.microsoft.com/en-us/magazine/cc163725.aspx

Si desea usar multitheading en su página ASP, puede usar un modelo de subprocesamiento simple como este:

 { System.Threading.Thread _thread = new Thread(new ThreadStart(Activity_DoWork)); _thred.Start(); } Activity_DoWork() { /*Do some things... } 

Este método funciona correctamente con páginas ASP. La página ASP con BackgroundWorker no se iniciará mientras BackgroundWorker finalizará.

5 años después, pero con los mismos problemas … Si desea realizar operaciones de disparar y olvidar desde su aplicación y olvidarse de todas las dificultades relacionadas con el procesamiento de trabajos en segundo plano en las aplicaciones ASP.NET, puede usar http://hangfire.io .

  • No pierde sus trabajos en el proceso de reciclaje, ya que utiliza el almacenamiento persistente para mantener la información sobre los trabajos en segundo plano.
  • Reintenta automáticamente los trabajos en segundo plano que se cancelaron o fallaron debido a una excepción transitoria (errores de conectividad del servidor SMTP).
  • Le permite depurar fácilmente trabajos en segundo plano a través de la interfaz web integrada.
  • Es muy fácil de instalar / configurar / usar HangFire.

También hay un tutorial que envía correo en segundo plano con ASP.NET MVC para usar HangFire con Postal .