c# – async / await和IDisposable接口

栏目: ASP.NET · 发布时间: 7年前

内容简介:你这样做的根本错误.一个很好的规则要记住,如果你认为你需要一个析构函数,那么99.9%的时间你就错了.只有拥有需要释放的非托管类型的私有变量时,才需要析构函数.你没有.你可以告诉你做错的方法是当你发现如果处理参数为假,你根本没有做任何事情.或者换句话说,析构函数实际上并没有做任何事情.所以不需要它.那么你也不需要一次性图案.还有更多的错误,你需要继承IDisposable接口来实现自己的Dispose()方法.你忘了.您的Dispose()方法需要由创建Email类实例的客户端代码调用.您不能自己调用​​它
我有一个实现IDisposable接口的类来处理私有变量_MailMessage同一个类有一个异步方法,它使用私有IDisposable变量,即async public Task<

bool>发送我的问题是:异步方法完成后,正常的IDisposable实现是否会配置私有变量?这是我正在谈论的课程的一个例子:

public class Email : IEmail
{
    private readonly IEmailData _EmailData;
    private MailMessage _MailMessage = new MailMessage();

    public Email(IEmailData emailData)
    {
        if (emailData == null)
        {
            throw new ArgumentNullException("emailData");
        }
        if (String.IsNullOrEmpty(emailData.To))
        {
            throw new ArgumentNullException("emailData.To");
        }
        if (String.IsNullOrEmpty(emailData.From))
        {
            throw new ArgumentNullException("emailData.From");
        }
        if (String.IsNullOrEmpty(emailData.FromName))
        {
            throw new ArgumentNullException("emailData.FromName");
        }
        if (String.IsNullOrEmpty(emailData.Subject))
        {
            throw new ArgumentNullException("emailData.Subject");
        }
        if (String.IsNullOrEmpty(emailData.Body))
        {
            throw new ArgumentNullException("emailData.Body");
        }

        _EmailData = emailData;
    }


    async public Task<bool> Send()
    {
        return await Task.Run<bool>(() =>
        {
            using (SmtpClient smtp = new SmtpClient())
            {
                smtp.Send(_MailMessage);
            }
            return true;
        });
    }

    #region "IDisposable implementation"
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }


    ~Email()
    {
        Dispose(false);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (disposing)
        {
            if (_MailMessage != null)
                _MailMessage.Dispose();
        }
    }
    #endregion

}

我根据建议不使用析构函数的答案之一更改了IDisposable实现:

#region "IDisposable implementation"
public void Dispose()
{
    Dispose(true);
    GC.SuppressFinalize(this);
}

protected virtual void Dispose(bool disposing)
{
    if (disposing)
    {
        if (_MailMessage != null)
            _MailMessage.Dispose();
    }
}
#endregion

你这样做的根本错误.一个很好的规则要记住,如果你认为你需要一个析构函数,那么99.9%的时间你就错了.只有拥有需要释放的非托管类型的私有变量时,才需要析构函数.你没有.你可以告诉你做错的方法是当你发现如果处理参数为假,你根本没有做任何事情.或者换句话说,析构函数实际上并没有做任何事情.所以不需要它.那么你也不需要一次性图案.

还有更多的错误,你需要继承IDisposable接口来实现自己的Dispose()方法.你忘了.

您的Dispose()方法需要由创建Email类实例的客户端代码调用.您不能自己调用​​它,您不知道客户端代码何时停止使用您的Email对象.这是对您的问题的快速回答,您不能将自己置于Send()方法中.无法保证客户端代码实际上会调用它.您必须将其留给客户端代码以使其正确.

翻译自:https://stackoverflow.com/questions/18849825/async-await-and-the-idisposable-interface


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

微信民族志、自媒体时代的知识生产与文化实践

微信民族志、自媒体时代的知识生产与文化实践

赵旭东 / 中国社会科学出版社 / 2017-9 / 98.00元

进入二十一世纪以来,随着网络技术的发展,自媒体的悄然登场深度影响着我们的日常生活。中国社会中自媒体通讯方式的普及以及随之而有的一种文化书写的新形式——微信民族志的出现使原有文化秩序中时空意义发生转变的同时,也在重新塑造着以研究异文化为己任的人类学学科自身的成长、转型与发展。在此种情境之下,由中国人民大学人类学研究所、中国人民大学国家发展与战略研究院、中国人民大学社会学理论与方法研究中心、《探索与争......一起来看看 《微信民族志、自媒体时代的知识生产与文化实践》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

SHA 加密
SHA 加密

SHA 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具