2012-05-22 18 views
25

Tengo el siguiente código:¿Necesitamos deshacernos o terminar un hilo en C# después del 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); 

Quiero el envío por hacer en el plano sin interferir con el hilo principal electrónico. No me importa cuando esté terminado.

¿Debo manejar de alguna manera el desecho del hilo creado (mailThread)? ¿O se desecha automáticamente cuando termina su trabajo?

No recomendamos el método SendAsync. Me gustaría crear el hilo manualmente. Mail.Send solo fue un escenario de ejemplo.

Gracias.

Respuesta

33

NO!

no es necesario desechar el objeto Thread (por cierto, la clase Thread no proporciona el método Dispose).

7

El subproceso se elimina cuando su rutina llega al final.
Así que NO, no tienes que hacerlo, no es necesario (ni creo que sea posible).

+5

Pero no el objeto de subproceso. El objeto de subproceso es elegible para la recolección de basura inmediatamente. http://stackoverflow.com/questions/3699147/c-sharp-thread-object-lifetime –

1

Bueno, su SmtpClient debe ser Dispose() 'd. Utilizaría la Biblioteca paralela de tareas en lugar de crear subprocesos sin procesar:

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

Como nota al margen, si alguien decide llamar a este método en una aplicación ASP.Net, el subproceso utilizado para hacer esta llamada será uno del grupo de aplicaciones, y con suficientes de estos tipos de llamadas, puede técnicamente pasar hambre al grupo de subprocesos de IIS. Crear un nuevo hilo 'new Thread' no tiene este problema (aunque crea una nueva sobrecarga al crear el hilo). –

+0

Siempre debe esperar en las tareas. Ver mi pregunta en http://stackoverflow.com/questions/14346108/what-happens-to-work-scheduled-by-task-run-after-the-the-program-terminates –

Cuestiones relacionadas