2010-04-19 117 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