2010-01-27 22 views
5

La mia applicazione è un asp.net 3.5 in esecuzione su iis 6 (windows 2003) Questa applicazione serve migliaia di utenti al giorno (100-500 utenti in linea).asp.net ThreadPool - funzionamento di lunga durata

Desidero inviare una newsletter settimanale ai clienti.

Circa 200.000 email ogni volta.

Questo è il codice che sto utilizzando:

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); 
    } 
} 

Durante il test di questo locale (sulla mia macchina dev) Vedo l'applicazione sta lavorando molto più lento.

  1. C'è un modo migliore per scrivere questo codice?
  2. meglio utilizzare ThreadPool.QueueUserWorkItem o creare un nuovo thread utilizzando t = filettatura new Thread (nuovo ThreadStart (DoWork)); ?
  3. Sarà meglio creare un'applicazione completamente separata ai fini dell'invio delle newsletter. questo aiuterà se mal eseguito questa applicazione sulla stessa macchina?

Ho visto altri post qui parlare di ThreadPool vs Thread ma sembra che nessuno sia sicuro di quale sia il migliore.

risposta

3

In ordine di preferenza:

  1. Creare un'altra applicazione. servizio di Windows sarebbe una buona scelta
  2. Usa Thread t = new Thread(new ThreadStart(DoWork));
  3. Il tuo attuale implementazione
+0

grazie! , se creo un servizio Windows, dovrei usare anche i thread? se continuo ad usare asp.net, perché il nuovo thread è migliore rispetto a ThreadPool? – RuSh

+0

Sì, si consiglia di utilizzare le discussioni. Se continui a utilizzare ASP.NET, quindi utilizzare ThreadPool per attività a esecuzione prolungata è una cattiva idea, poiché questi thread vengono utilizzati per soddisfare le richieste e se molti di essi sono bloccati per tali operazioni, il sito potrebbe smettere di funzionare. –

2

Spostamento di asp.net sarebbe una buona scelta. Potrebbe trattarsi di una semplice app da riga di comando che viene eseguita da un prompt dei comandi. Perché hai bisogno di un servizio o di essere ospitato come URL?

+0

Non ho bisogno che sia ospitato come url, ma è più semplice dato che ho già tutto il codice di accesso funzione/dati in questo progetto asp.net. – RuSh

+0

@sharru, è possibile suddividere il progetto in parti diverse e tutti gli accessi alle funzioni e i dati possono essere separati in un progetto condiviso. Questo è comunque un buon design, anche se non hai avuto questo processo separato da eseguire. –

+0

è un po 'in ritardo per quello :) è un grande progetto. posso esatto codice relativo e usarlo, o posso semplicemente usare la DLL asp.net nel servizio, no? – RuSh

1

Sì, penso che dovresti spostarlo dall'app web, dato che stai raccogliendo thread dal pool di thread necessari per soddisfare le tue richieste (sembra che tu abbia una buona quantità di traffico).

Si inviano anche le e-mail in modo sincrono, il che significa che il thread viene utilizzato per molto più tempo del necessario. Se si continua ad utilizzare questo approccio ThreadPool, suggerirei di metterli in coda al servizio SMTP di IIS (guardare Sistema. Net.Mail.SmtpClient.DeliveryMethod) che scrive solo un file in una cartella della coda, che viene monitorata dal servizio SMTP IIS.

Ma in realtà dovresti considerare di passare a un servizio di Windows.

+0

Grazie! , sembra un buon consiglio! Immagino che questo non sia il comportamento predefinito di SmtpClient? – RuSh

+0

Nessun problema. No, non è il comportamento predefinito, per farlo è necessario impostare mySmtpClientInstance.DeliveryMethod = DeliveryMethod .PickupDirectoryFromIis e assicurarsi che il servizio SMTP di IIS sia in esecuzione. In bocca al lupo.. – JonoW

Problemi correlati