2010-04-19 113 views
2

在使用SendAsync時,處置SmtpClientMailMessage的正確方法是什麼?SmtpClient.SendAsync代碼審查

我已經在下面複製了我的代碼。

{ 
... 
var client = new SmtpClient {Host = _smtpServer}; 
client.SendCompleted += SendCompletedCallback; 
var userState = mailMessage; 
client.SendAsync(mailMessage, userState); 
... 
} 

private static void SendCompletedCallback(object sender, 
    AsyncCompletedEventArgs e) 
{ 
    // Get the unique identifier for this asynchronous operation. 
    var mailMessage= (MailMessage)e.UserState; 

    if (e.Cancelled) 
    { 
     Log.Info(String.Format("[{0}] Send canceled.", mailMessage)); 
    } 
    if (e.Error != null) 
    { 
     Log.Error(String.Format("[{0}] {1}", mailMessage, e.Error)); 
    } 
    else 
    { 
     Log.Info("Message sent."); 
    } 
    mailMessage.Dispose(); 
} 

處置的MailMessageclient.SendAsync(...)後拋出異常。我需要將它置於回調處理程序中。

回答

1

這看起來正確。

請注意,MailMessage不覆蓋ToString,所以您的日誌將簡單地說[MailMessage] Send cancelled
您可能希望使用Subject proeprty(或其他某個屬性)。

+0

我從MSDN http://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient.aspx哪裏誤導,因爲這個例子中的他們在主函數中處理mailMessage,而不是在回調中。 – 2010-04-19 12:32:43

+0

@Lieven Cardoen,原因是,該示例使用控制檯並等待用戶輸入 – Fredou 2010-04-19 12:35:22

+0

好了,thx爲ToString註釋。 – 2010-04-19 12:35:38

2

我認爲這將有助於

client.SendCompleted += (s, e) => { client.Dispose(); message.Dispose(); }; 
+0

但是使用這種方式會發送完成的事件處理程序確切地知道哪些客戶端和消息對象需要處理?在循環內使用多個異步發送的情況。 我在問,因爲在第一個例子中,他通過userState參數發送Message對象。 – Sawd 2015-01-30 17:25:34