【问题标题】:Dispose SmtpClient in SendComplete?在 SendComplete 中处理 SmtpClient?
【发布时间】:2011-04-14 08:14:43
【问题描述】:

当我使用 SmtpClient 的 SendAsync 发送电子邮件时,如何正确处置 smtpclient 实例?

假设:


MailMessage mail = new System.Net.Mail.MailMessage()
{
   Body = MailBody.ToString(),
   IsBodyHtml = true,
   From = new MailAddress(FromEmail, FromEmailTitle),
   Subject = MailSubject
};
mail.To.Add(new MailAddress(i.Email, ""));
SmtpClient sc = new SmtpClient(SmtpServerAddress);
//Add SendAsyncCallback to SendCompleted
sc.SendCompleted += new SendCompletedEventHandler(SendAsyncCallback);
//using SmtpClient to make async send (Should I pass sc or mail into SendAsyncCallback?)
sc.SendAsync(mail, sc);

SendAsyncCallback方法中,我应该调用sc.Dispose(),还是mail.Dispose()

我查看了 MSDN 文档,其中一个示例调用 MailMessage.Dispose(),但是这个 dispose 方法是否也会释放 SmtpClient 实例?

【问题讨论】:

    标签: c# dispose smtpclient sendasync


    【解决方案1】:

    您应该在SendAsyncCallback 中同时处理MailMessageSmtpClient

    释放 MailMessage 不会自动释放 SmtpClient(因为您可能希望使用相同的 SmtpClient 发送两条消息,并且您不希望在释放第一条消息后立即释放客户端)。

    【讨论】:

    • 您如何从SendAsyncCallback 中访问MailMessage 以便Dispose 它?如果我们将其设为全局变量(字段),我们必然会遇到冲突(本例中为 MVC 应用程序)。
    • 我可以通过发送MailMessage 作为SendAsync() 的第二个参数的令牌来做到这一点。
    【解决方案2】:

    此示例:来自 MSDN 库文档仅关闭消息,因此我将在我的实现中使用它:SmtpClient.SendAsync Method

    message.Dispose();
    

    我遇到了这个问题中提到的这个问题,发送总是被取消,所以我删除了我的 using {} 语句:SmtpClient.SendAsync Calls are Automatically Cancelled

    好的,我刚刚尝试发出 message.Dispose() ,即使这样也抛出了错误,说由于消息被处理而无法发送电子邮件。可能是因为我的是一个 asp.net mvc 应用程序,而示例是一个控制台应用程序。无论如何,一旦一切都超出范围,垃圾收集器应该选择这些选项......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-16
      • 1970-01-01
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-18
      • 1970-01-01
      相关资源
      最近更新 更多