2

我有一个附加到 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

4 回答 4

9

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

于 2011-09-09T21:41:03.433 回答
4

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

于 2016-10-10T09:23:28.583 回答
2

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

using(MailMessage m = ...)
{
    ...
    using (Attachment data = ...)
    { 
        ...
        using (SmtpClient s = ...)
        {
           ...
        }
    }
}
于 2011-09-09T21:40:55.727 回答
1

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

...
s.Send(m)

data.Dispose();
于 2011-09-09T21:39:08.140 回答