【问题标题】:Closing file attached to email System.Net.Mail关闭附加到电子邮件 System.Net.Mail 的文件
【发布时间】:2011-09-09 21:35:07
【问题描述】:

我有一个附加到 ASP.NET 应用程序中的电子邮件的文件。问题是进程不会放过文件。如何在方法中关闭文件,以便再次在程序中使用它?

Attachment data = new Attachment(@"\\WIN-UWPWZ7Z3RKX\wwwroot\katipro\skus.txt");
m.Attachments.Add(data); 

SmtpClient s = new SmtpClient("smtp.gmail.com", 587);
s.Send(m);

在我调用该方法后,它不允许我再次写入该文件而不会出现错误。

【问题讨论】:

  • 正如@Sam 下面提到的,它足以处理MailMessage。如果您有多个附件,接受的答案将难以维护。

标签: c# system.net.mail


【解决方案1】:

System.Net.Mail.Attachment 实现IDisposable。您需要处理您的附件。

using(Attachment data = new Attachment(@"\\WIN-UWPWZ7Z3RKX\wwwroot\katipro\skus.txt"))
{
    m.Attachments.Add(data); 

    SmtpClient s = new SmtpClient("smtp.gmail.com", 587);
    s.Send(m);
}

同样,如果您使用的是 .NET Framework 4.0; SmtpClient 也是一次性的。因此,如果您使用的是 4.0 框架,请丢弃它。您应该始终在使用完实现 IDisposable 接口的东西后丢弃它们。

【讨论】:

    【解决方案2】:

    您在处置 MailMessage 时不需要处置附件。如果您查看内部实现,MailMessage 确实已经处理了附件本身。

    // MailMessage.cs
    protected virtual void Dispose(bool disposing)
        {
            if (disposing && !disposed)
            {
                disposed = true;
    
                if(views != null){
                    views.Dispose();
                }
                if(attachments != null){
                    attachments.Dispose();
                }
                if(bodyView != null){
                    bodyView.Dispose();
                }
            }
        }
    

    来自https://referencesource.microsoft.com/#System的代码

    【讨论】:

      【解决方案3】:

      您需要释放所有用于它们的IDisposable 对象,以释放文件句柄等非托管资源。

      using(MailMessage m = ...)
      {
          ...
          using (Attachment data = ...)
          { 
              ...
              using (SmtpClient s = ...)
              {
                 ...
              }
          }
      }
      

      【讨论】:

        【解决方案4】:

        Attachment 实现了IDisposable;发送消息后,您需要处置实例以释放其资源。

        ...
        s.Send(m)
        
        data.Dispose();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-09-02
          • 2014-06-25
          • 2013-08-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-30
          相关资源
          最近更新 更多