繁体   English   中英

关闭附加到电子邮件 System.Net.Mail 的文件

[英]Closing file attached to email System.Net.Mail

我有一个文件附加到 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);

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

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 接口的东西时,您应该始终处理它们。

处理 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 的代码

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

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

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

...
s.Send(m)

data.Dispose();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM