2012-05-22 105 views
25

我有以下代碼:我們是否需要在C#中使用後處理或終止線程?

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

我想要的郵件發送在後臺完成而無需與主線程干擾。我不在乎什麼時候結束。

我是否需要以某種方式處理創建的線程處理(mailThread)? 還是它在完成工作時自動處理?

請不要推薦SendAsync方法。我想手動創建線程。 Mail.Send只是一個示例場景。

謝謝。

回答

33

不!

不需要配置Thread對象(順便說一下,Thread類不提供Dispose方法)。

7

線程在其例行程序結束時插入。
所以不,你不必這樣做,這是沒有必要的(我想也是不可能的)。

+5

但不是線程對象。線程對象有資格立即進行垃圾回收。 http://stackoverflow.com/questions/3699147/c-sharp-thread-object-lifetime –

1

那麼,你的SmtpClient應該是Dispose()'d。我會使用任務並行庫,而不是創建原始線程:

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

作爲一個方面說明,如果有人決定在ASP.Net應用程序中調用此方法,用於進行此調用的線程將是一個來自應用程序池,並且具有足夠的這些類型的調用可以在技術上阻止IIS線程池。創建一個新的線程'new Thread'沒有這個問題(儘管在創建線程時會產生新的開銷)。 –

+0

你應該一直等待任務。看到我的問題在http://stackoverflow.com/questions/14346108/what-happens-to-work-scheduled-by-task-run-after-the-the-program-terminates –

相關問題