处理MailMessage附件

时间:2017-10-24 21:05:41

标签: c# idisposable

执行以下操作是否可以接受:

Attachment attachment = new Attachment(path, mediaType);

//Do other stuff...

using(attachment)
{
   //Send email
}

我通常直接在using语句中创建我的一次性用法,但在这种情况下它有点复杂。

背景

我刚刚遇到遗留应用程序中的错误,其中电子邮件附件未释放文件句柄。因此,该文件无法再被修改,因为它已在使用中。

似乎问题是程序员忘了在附件上调用Dispose()。通常,这将是一个容易解决的问题,但在这种情况下,由于代码的结构,我无法在创建时直接将附件放入使用中。

上面的替代方案是否妥协?

2 个答案:

答案 0 :(得分:7)

真正的问题是您不需要Dispose the Attachment,因为MailMessage会在您调用MailMessage上的Dispose时自动处理附件。

using(MailMessage message = ...)
{

}

查看MailMessage类的内部结构,您将看到正在处理附件集合(附件):

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/net/System/Net/mail/MailMessage.cs

答案 1 :(得分:0)

如果在//Do other stuff期间发生异常,则不会丢弃您的对象。

你可以使用更传统的尝试/终于:

Attachment attachment;
try
{
    attachment = new Attachment(path, mediaType);
    //Do other stuff...
}
catch
{
    //Handle or log exception
}
finally
{
    if (attachment != null) attachment.Dispose();
}