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

时间:2011-09-09 21:35:07

标签: c# 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);

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

4 个答案:

答案 0 :(得分:7)

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 Framework,请将其丢弃。在使用完IDisposable接口时,你应始终处理实现IDisposable接口的东西。

答案 1 :(得分:2)

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

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

答案 2 :(得分: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 :(得分:1)

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

...
s.Send(m)

data.Dispose();