2013-01-25 34 views
5

我開發了一個主要使用SMTP發送電子郵件的應用程序。逐個發送消息很好,但是我期待着加快這個過程。我創建了多個SmtpClient實例以及消息以避免彼此衝突。由於不同的實例,我假設在多個線程上執行.Send()會很好。但是,單獨使用我的Thread代碼的某些內容不起作用,因爲我無法使用此代碼在一個線程上發送一封電子郵件。我只是收到一個模糊的"Failure sending mail"異常。我將發佈有效的代碼,以及不起作用的Thread。有人可以分享他們認爲可能的原因嗎?C#使用System.Threading發送SMTP

注意我目前不打算使用新的async能力,而是利用Thread

工作宣言和方法調用:

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

不工作主題的聲明和方法調用:

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

你有'新Thread'了'using'塊內'message'?這樣,消息可能會在新線程發送之前處理。 –

+0

用另一種方法包裝你的工作聲明和工作方法,然後在線程中使用該方法 – nsconnector

+0

我沒有。你能再詳細一點嗎?我也不確定你在新線程發送之前被處置的意思,爲了測試,我只使用了一個線程。我也可以離開這裏,我希望你能和我一起生活。 – scniro

回答

11

解決:

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如果新線程(...),T1中發生異常,該怎麼辦?Start()會啓動還是拋出異常? –

+0

***錯誤處理***? –

1

爲什麼不直接使用Smtp.SendAsync方法?

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

+4

由於SendAsync仍會阻塞UI線程,有時您不希望用戶必須等待它。所以你把它們發送到後臺線程上。 –

+0

@BradBamford更好的解決方案和代碼示例沒有*** SendAsync ***? –

2

你可以做到這一點甚至通過預先定義的一切,剛剛調用新線程更容易。

//define everything above 

Thread t1 = new Thread(delegate() 
{ 

    SMTP.send(message); 

}); 

t1.Start(); 

那是什麼我做了,這讓生活更容易與那些花括號