【问题标题】:SmtpClient.SendAsync code reviewSmtpClient.SendAsync 代码审查
【发布时间】:2011-02-09 16:10:21
【问题描述】:

在使用SendAsync 时,处理SmtpClientMailMessage 的正确方法是什么?

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

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

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

【问题讨论】:

    标签: c# .net smtpclient mailmessage


    【解决方案1】:

    这看起来是正确的。

    请注意,MailMessage 不会覆盖 ToString,因此您的日志只会显示 [MailMessage] Send cancelled
    您可能想改用 Subject 属性(或其他属性)。

    【讨论】:

    • 我被误导了,因为来自 msdn msdn.microsoft.com/en-us/library/… 的这个示例,他们将 mailMessage 放在主函数中而不是回调中。
    • @Lieven Cardoen,原因是,示例使用控制台并等待用户输入
    • 是的,但是如果你快速按下任何键,你可能会得到和我一样的错误,不是吗?也许我错过了什么。
    【解决方案2】:

    我认为这会有所帮助

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

    【讨论】:

    • 但是使用这种方式将 sendcompleted 事件处理程序确切知道需要处理哪些客户端和消息对象?如果在循环内使用多个异步发送。我问是因为在第一个示例中,他通过 userState 参数发送 Message 对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    相关资源
    最近更新 更多