¿Está bien pasar un objeto System.Net.Mail.MailMessage en un delegado en C#?
memory memory-leaks (1)
He creado una pequeña clase SmtpSender que maneja el envío de un objeto Smtp MailMessage. Cuando el mensaje se envió o no se pudo enviar, planteé un delegado que contiene un objeto de ''respuesta'' que tiene el mensaje de correo original que el usuario estaba tratando de enviar junto con un booleano de éxito / error y una cadena de error. El usuario puede volver a enviar el objeto MailMessage a la clase del remitente para volver a intentarlo si lo desea.
Lo que quiero saber es ... si planteo un delegado que contiene un objeto con recursos no administrados, ¿necesito entonces disponer el objeto en el alcance actual? Si es así, ¿llamar a Dispose en el alcance actual mata al objeto que recibe la función de delegado? Me preocupan las pérdidas de memoria a largo plazo aquí.
Cualquier consejo o ayuda sería muy apreciado. ¡Gracias por adelantado!
Dave
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
}
Cuando llamas a dispose en un Object, dices que ya terminaste y que debe entrar en un estado "roto" que el recolector de basura puede limpiar. Entonces una vez que esté dispuesto no lo usaría de nuevo. Así que solo deséchelo cuando haya terminado con él.
El último objeto para usar / tocar la clase debe eliminarlo. No lo elimine temprano.