2010-01-27 12 views
5

Mi aplicación es una asp.net 3.5 que se ejecuta en iis 6 (Windows 2003) Esta aplicación atiende a 1000 usuarios a diario (100-500 usuarios en línea).asp.net ThreadPool - operación de larga duración

Deseo enviar un boletín por correo electrónico a los clientes semanalmente.

Alrededor de 200,000 correos electrónicos cada vez.

Este es el código que estoy usando:

ThreadPool.QueueUserWorkItem(new WaitCallback(AsyncProcessMailerQueue), null); 

private static void AsyncProcessMailerQueue(object data) 
{ 
    for (int i=0;i<users.count ; i++) 
    { 
     MailMessage message = new MailMessage(); 
     ....... 
     SmtpClient smtpClient = new SmtpClient(); 
     smtpClient.Send(message); 
    } 
} 

Al probar este local (en mi máquina dev) Veo la aplicación está funcionando mucho más lento.

  1. ¿Existe alguna forma mejor de escribir este código?
  2. ¿Debo usar ThreadPool.QueueUserWorkItem o crear un nuevo hilo con hilo t = nuevo Thread (nuevo ThreadStart (DoWork)); ?
  3. ¿Será mejor crear una aplicación totalmente separada con el propósito de enviar los boletines informativos? ¿Eso ayudará si ejecuta esta aplicación en la misma máquina?

He visto otros mensajes aquí hablando de ThreadPool vs Thread pero parece que nadie está seguro de cuál es mejor.

Respuesta

3

En orden de preferencia:

  1. crear otra aplicación. servicio de Windows sería una buena opción
  2. Uso Thread t = new Thread(new ThreadStart(DoWork));
  3. Su implementación actual
+0

gracias! , si creo un servicio de Windows, ¿debería usar hilos también? si sigo usando asp.net, ¿por qué un hilo nuevo es mejor que usar ThreadPool? – RuSh

+0

Sí, se recomienda usar hilos. Si continúa utilizando ASP.NET, usar ThreadPool para tareas de larga ejecución es una mala idea porque estos subprocesos se utilizan para atender solicitudes y si tiene muchos de ellos bloqueados para tales operaciones, el sitio podría dejar de funcionar. –

2

Salir de asp.net sería una buena opción. Esta podría ser una aplicación de línea de comando simple que ejecuta desde un símbolo del sistema. ¿Por qué necesita un servicio o está alojado como una URL?

+0

no necesito que se aloje como una url, pero es simplemente más simple ya que tengo todo el código de acceso a función/datos en este proyecto asp.net. – RuSh

+0

@sharru, puede dividir el proyecto en diferentes partes y todas las funciones de acceso y datos se pueden separar en un proyecto compartido. De todos modos, este es un buen diseño, incluso si no tienes este proceso por separado para ejecutar. –

+0

es un poco tarde para eso :) es un gran proyecto. Puedo especificar el código relacionado y usarlo, o simplemente puedo usar asp.net dll en el servicio, ¿no? – RuSh

1

Sí, creo que deberías eliminar esto de tu aplicación web, ya que estás recogiendo subprocesos del grupo de subprocesos que se necesitan para atender tus solicitudes (parece que recibes una buena cantidad de tráfico).

También está enviando los correos electrónicos de forma sincrónica, lo que significa que el hilo se está utilizando por mucho más tiempo de lo necesario. Si continúa utilizando este enfoque ThreadPool, sugeriría ponerlos en cola al servicio IIS SMTP (mire System. Net.Mail.SmtpClient.DeliveryMethod) que simplemente escribe un archivo en una carpeta de cola, que es monitoreada por el servicio IIS SMTP.

Pero realmente deberías considerar mover esto a un servicio de Windows.

+0

¡Gracias! , eso suena como un buen consejo! Supongo que este no es el comportamiento predeterminado del SmtpClient? – RuSh

+0

No hay problema. No, no es el comportamiento predeterminado, para hacerlo debe establecer mySmtpClientInstance.DeliveryMethod = DeliveryMethod. PickDirectoryFromIis y asegurarse de que el servicio IIS SMTP se esté ejecutando. Buena suerte.. – JonoW

Cuestiones relacionadas