SmtpClient.Send异步代码审查

时间:2010-04-19 12:28:25

标签: c# .net smtpclient mailmessage

使用SmtpClient时处理MailMessageSendAsync的正确方法是什么?

我在下面复制了我的代码。

{
...
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();
}

MailMessage之后处置client.SendAsync(...)会引发异常。我需要将它放在Callback处理程序中。

2 个答案:

答案 0 :(得分:2)

我认为这可能会有所帮助

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

答案 1 :(得分:1)

这看起来是正确的。

请注意MailMessage不会覆盖ToString,因此您的日志只会说[MailMessage] Send cancelled
您可能希望使用Subject proeprty(或其他一些属性)。