2012-05-22 10 views
25

Ho il codice seguente:È necessario disporre o terminare una discussione in C# dopo l'uso?

 public static void Send(this MailMessage email) 
    { 
     if (!isInitialized) 
      Initialize(false); 
     //smtpClient.SendAsync(email, ""); 
     email.IsBodyHtml = true; 

     Thread mailThread = new Thread(new ParameterizedThreadStart(
      (o) => 
      { 
       var m = o as MailMessage; 

       SmtpClient client= new SmtpClient("smtpserveraddress"); 
       client.Send(m); 

      })); 
     mailThread.Start(email); 

voglio la posta di invio deve essere fatto in background senza interferire con il thread principale. Non mi interessa quando è finito.

Devo in qualche modo gestire lo smaltimento del thread creato (mailThread)? Oppure si dispone automaticamente quando termina il suo lavoro?

Si consiglia di non consigliare il metodo SendAsync. Vorrei creare il thread manualmente. Mail.Send era solo uno scenario di esempio.

Grazie.

risposta

33

NO!

non è necessario disporre dell'oggetto Thread (BTW, la classe Thread non fornisce il metodo Dispose).

7

Il filo è diposed quando la sua routine viene alla fine.
Quindi NO, non devi farlo, non è necessario (né possibile penso).

+5

Ma non l'oggetto thread. L'oggetto thread è idoneo per la garbage collection immediatamente. http://stackoverflow.com/questions/3699147/c-sharp-thread-object-lifetime –

1

Bene, il tuo SmtpClient dovrebbe essere Dispose() 'd. Utilizzerei la Libreria parallela attività invece di creare thread non elaborati:

public static void Send(this MailMessage email) 
{ 
    if (!isInitialized) 
     Initialize(false); 
    //smtpClient.SendAsync(email, ""); 
    email.IsBodyHtml = true; 

    Task.Factory.StartNew(() => 
    { 
     // Make sure your caller Dispose()'s the email it passes in at some point! 
     using (SmtpClient client = new SmtpClient("smtpserveraddress")) 
     { 
      client.Send(email); 
     } 
    }); 
} 
+0

Come nota a margine, se qualcuno decide di chiamare questo metodo in un'applicazione ASP.Net, il thread utilizzato per effettuare questa chiamata sarà uno dal pool di applicazioni e con un numero sufficiente di questi tipi di chiamate può affamare tecnicamente il pool di thread IIS. La creazione di un nuovo thread 'new Thread' non ha questo problema (sebbene crei un nuovo sovraccarico nella creazione del thread). –

+0

Dovresti sempre attendere le attività. Vedi la mia domanda su http://stackoverflow.com/questions/14346108/what-happens-to-work-scheduled-by-task-run-after-the-the-program-terminates –

Problemi correlati