2012-05-22 7 views
25

Mam następujący kod:Czy musimy pozbyć się lub zakończyć wątek w C# po użyciu?

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

chcę Przesyłanie do zrobienia w tle, bez ingerencji w głównym wątku. Nie obchodzi mnie, kiedy to się skończy.

Czy muszę w jakiś sposób obsługiwać utworzony wątek (mailThread)? Czy robi to automatycznie po zakończeniu pracy?

Nie polecaj metody SendAsync. Chciałbym utworzyć wątek ręcznie. Mail.Send był tylko przykładowym scenariuszem.

Dziękuję.

Odpowiedz

33

NIE!

nie ma potrzeby usuwania obiektu Thread (BTW, klasa Thread nie udostępnia metody Dispose).

7

Wątek jest zanurzony, gdy kończy się jego procedura.
Więc NIE, nie musisz tego robić, nie jest to konieczne (ani nie możliwe, jak sądzę).

+5

Ale nie obiekt wątku. Obiekt wątku kwalifikuje się do natychmiastowego usuwania śmieci. http://stackoverflow.com/questions/3699147/c-sharp-thread-object-lifetime –

1

Twój SmtpClient powinien być Dispose() 'd. Zamiast tworzenia nieprzetworzonych wątków użyłbym zadania równoległego Library:

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

Na marginesie, jeśli ktoś zdecyduje się wywołać tę metodę w aplikacji ASP.Net, wątek użyty do wykonania tego połączenia będzie jeden z puli aplikacji i przy wystarczającej liczbie takich wywołań może technicznie zagłodzić pulę wątków IIS. Utworzenie nowego wątku 'new Thread' nie ma tego problemu (chociaż tworzy nowy narzut podczas tworzenia wątku). –

+0

Zawsze powinieneś czekać na zadania. Zobacz moje pytanie na http://stackoverflow.com/questions/14346108/what-happens-to-work-scheduled-by-task-run-after-the-the-program-terminates –