在C#中向委托传递System.Net.Mail.MailMessage对象可以吗?

在C#中向委托传递System.Net.Mail.MailMessage对象可以吗?,c#,memory,memory-leaks,smtp,mailmessage,C#,Memory,Memory Leaks,Smtp,Mailmessage,我制作了一个小的SmtpSender类,用于处理Smtp邮件对象的发送。当消息已发送或发送失败时,我将引发一个委托,该委托包含一个“response”对象,该对象包含用户试图发送的原始邮件消息以及一个success/fail布尔值和一个错误字符串。然后,用户可以将MailMessage对象重新提交给sender类,以便在需要时重试 我想知道的是。。。如果我引发的委托包含具有非托管资源的对象,那么我是否需要在当前作用域中处置该对象?如果是这样,在当前范围内对其调用Dispose会杀死委托函数接收的

我制作了一个小的SmtpSender类,用于处理Smtp邮件对象的发送。当消息已发送或发送失败时,我将引发一个委托,该委托包含一个“response”对象,该对象包含用户试图发送的原始邮件消息以及一个success/fail布尔值和一个错误字符串。然后,用户可以将MailMessage对象重新提交给sender类,以便在需要时重试

我想知道的是。。。如果我引发的委托包含具有非托管资源的对象,那么我是否需要在当前作用域中处置该对象?如果是这样,在当前范围内对其调用Dispose会杀死委托函数接收的对象吗?从长远来看,我担心内存泄漏

任何建议或帮助都将不胜感激。提前谢谢

戴夫


当您对一个对象调用dispose时,您会说您已经处理完它,它应该进入“已损坏”状态,可以由垃圾收集器清理。所以一旦它被处理掉,我就不会再使用它了。所以,只有当你处理完后才可以处理它


最后一个使用/接触该类的对象应该处理它。不要过早地处理它。

只需确保在您知道已处理完它时处理它,对象会根据需要公开
dispose
方法来销毁它自己。一般来说,如果一个对象包含一个一次性对象,那么他们负责管理它,你的类负责处理它——因此,这实际上取决于你的类何时完成处理。尽管我可以看到不以这种方式传递这些项的理由,正如一些人可能会问的那样:根对象的责任是什么?就像您在处理程序中处理一样,下一个订户(如果有)呢?好问题。仅供参考,澄清一下我所指的“具有非托管资源的对象”是MailMessage对象。失望先生。sender类有一个类型为SMTPSenderEntEventHandler的事件。这将通过SmtpSendResponse对象引发到订阅服务器。然后,订阅者必须测试成功是否为真,如果是真的,他们就会处理它。如果success为false,则他们可能希望使用相同的MailMessage对象尝试重新发送。此代码不起任何作用。如果没有它,客户机代码看起来几乎是一样的,没有它必须找出失败原因以及何时处理对象的问题。试试看,这没什么用。它只是一个holder对象,表示Smtp发送的结果,它通过一个委托传递给订阅者进行查询。订阅者可能是一个表单或其他东西,他们只会向用户显示错误,并提供重试的能力。如果要重试,则需要将MailMessage对象传递回sender类。如果在那一点上成功的话,他们会处理它。在这种情况下,什么时候为时尚早?问题是,一个活动的订阅者根本不知道还有谁订阅了该活动,事实上,这与他们无关。如果我命令报童回去报社,因为他把我的报纸送来了,那么我邻居的报纸呢?我认为这就是问题真正变得比最初设想的更值得思考的地方。按照这个类比,如果你对报童说“回家”,它应该知道它是否必须再发送更多的文件,如果没有,它会愉快地遵守。在代码中,通常当没有更多的引用时,MailMessage _theMessage知道在垃圾收集时进行处理。因此,请处理所有委托,不要在共享(静态)对象上保留记录列表。
public delegate void SmtpSenderSentEventHandler(object sender, SmtpSendResponse theResponse);

public class SmtpSendResponse : IDisposable
{
    #region Private Members

    private MailMessage _theMessage;
    private bool _isSuccess;
    private string _errorMessage;

    #endregion

    #region Public Properties

    public MailMessage TheMessage
    {
        get { return _theMessage; }
        set { _theMessage = value; }
    }

    public bool IsSuccess
    {
        get { return _isSuccess; }
        set { _isSuccess = value; }
    }

    public string Error
    {
        get { return _errorMessage; }
        set { _errorMessage = value; }
    }

    #endregion

    #region Constructors

    public SmtpSendResponse(MailMessage theMessage, bool isSuccess)
        : this(theMessage, isSuccess, null)
    { }

    public SmtpSendResponse(MailMessage theMessage, bool isSuccess, string errorMessage)
    {
        _theMessage = theMessage;
        _isSuccess = isSuccess;
        _errorMessage = errorMessage;
    }

    #endregion

    #region IDisposable Members

    public void Dispose()
    {
        if (_theMessage != null)
        {
            _theMessage.Attachments.Dispose();
            _theMessage.Dispose();
        }
    }

    #endregion
}