2013-01-25 14 views
5

Ho sviluppato un'applicazione che invia principalmente messaggi di posta elettronica utilizza SMTP. L'invio di messaggi uno per uno va bene, tuttavia sto cercando di velocizzare il processo. Ho creato più istanze di SmtpClient e messaggi per evitare conflitti tra loro. A causa delle istanze separate, ho assunto che l'esecuzione di .Send() su più thread funzionasse correttamente. Tuttavia, qualcosa con il mio codice Thread non funziona, perché non posso inviare neanche una email su un thread usando questo codice. Ricevo semplicemente una vaga eccezione "Failure sending mail". Inserirò il codice che funziona e lo Thread non funziona. Qualcuno potrebbe condividere ciò che ritengono possa essere la causa?C# Invio SMTP tramite System.Threading

Nota io non sono attualmente alla ricerca di utilizzare i più recenti async capacità ma invece sfruttando Thread

Dichiarazione di lavoro e metodo di chiamata:

var SMTP = new SmtpClient 
    { 
     Host = txtBxSenderHost.Text, 
     Port = 587, 
     EnableSsl = true, 
     DeliveryMethod = SmtpDeliveryMethod.Network, 
     UseDefaultCredentials = false, 
     Credentials = new NetworkCredential(strSenderAddress, strSenderPassword) 
    }; 

using (var message = new MailMessage(senderAdrress, toAddress) 
    { 
     Subject = strSubject, 
     Body = strBody 
    }) 

    { 
     SMTP.Send(message); 
    } 

non funziona dichiarazione Discussione e metodo di chiamata:

var SMTP = new SmtpClient 
    { 
     Host = txtBxSenderHost.Text, 
     Port = 587, 
     EnableSsl = true, 
     DeliveryMethod = SmtpDeliveryMethod.Network, 
     UseDefaultCredentials = false, 
     Credentials = new NetworkCredential(strSenderAddress, strSenderPassword) 
    }; 

using (var message = new MailMessage(senderAdrress, toAddress) 
    { 
     Subject = strSubject, 
     Body = strBody 
    }) 

    { 
     Thread T1 = new Thread(delegate() { SMTP.Send(message); }); 
     T1.Start(); 
    } 
+0

Avete 'nuova Thread' all'interno di un blocco di' 'using' per message'? In questo modo, è probabile che il messaggio venga eliminato prima che il nuovo thread lo invii. –

+0

Avvolgere la dichiarazione di lavoro e il metodo di lavoro in un altro metodo e quindi utilizzare tale metodo nella discussione – nsconnector

+0

no. Puoi approfondire un po 'di più per favore? Sono anche incerto su cosa intendi per essere smaltito prima che il nuovo thread lo invii, per motivi di prova sto usando solo un thread. Potrei anche essere qui, spero che tu possa stare con me. – scniro

risposta

11

risolto:

var SMTP = new SmtpClient 
     { 
      Host = txtBxSenderHost.Text, 
      Port = 587, 
      EnableSsl = true, 
      DeliveryMethod = SmtpDeliveryMethod.Network, 
      UseDefaultCredentials = false, 
      Credentials = new NetworkCredential(strSenderAddress, strSenderPassword) 
     }; 

     Thread T1 = new Thread(delegate() 
     { 
      using (var message = new MailMessage(senderAdrress, toAddress) 
      { 
       Subject = strSubject, 
       Body = strBody 
      }) 
      { 
       { 
        SMTP.Send(message); 
       } 
      } 
     }); 

     T1.Start(); 
+0

@nsconnector cosa succede se si verifica un'eccezione nella nuova discussione (...), T1.Start() inizierà o genererà un'eccezione? –

+0

*** gestione errori ***? –

1

perché non utilizzare il metodo Smtp.SendAsync?

http://msdn.microsoft.com/en-us/library/x5x13z6h.aspx

+4

Poiché SendAsync blocca ancora il thread dell'interfaccia utente ea volte non si desidera che l'utente debba attendere su di esso. Quindi li mandi su un thread in background. –

+0

@BradBamford soluzione migliore e codice di esempio senza *** SendAsync ***? –

2

si può fare ancora più semplice attraverso la definizione di tutto in anticipo e il giusto chiamando il nuovo thread.

//define everything above 

Thread t1 = new Thread(delegate() 
{ 

    SMTP.send(message); 

}); 

t1.Start(); 

Questo è quello che ho fatto e che rende la vita più facile con quelle parentesi graffe