首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理MailMessage附件

处理MailMessage附件
EN

Stack Overflow用户
提问于 2017-10-24 21:05:40
回答 2查看 4.9K关注 0票数 3

这样做是否可以接受:

代码语言:javascript
复制
Attachment attachment = new Attachment(path, mediaType);

//Do other stuff...

using(attachment)
{
   //Send email
}

我通常直接在using语句中创建我的一次性操作,但在本例中,这有点复杂。

背景

我只是在一个遗留应用程序中遇到了一个bug,其中电子邮件附件没有释放文件句柄。因此,不能再修改该文件,因为它已经在使用中。

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

以上的选择是一个很好的妥协吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-24 21:18:31

真正的问题是,您不需要释放附件,因为MailMessage将在调用Dispose时和如果调用dispose时自动释放附件。

代码语言:javascript
复制
using(MailMessage message = ...)
{

}

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

代码语言:javascript
复制
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

票数 16
EN

Stack Overflow用户

发布于 2017-10-24 21:09:11

如果在//Do other stuff期间发生异常,则不会释放对象。

您可以使用更传统的尝试/最后:

代码语言:javascript
复制
Attachment attachment;
try
{
    attachment = new Attachment(path, mediaType);
    //Do other stuff...
}
catch
{
    //Handle or log exception
}
finally
{
    if (attachment != null) attachment.Dispose();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46920000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档