У меня есть класс, который реализует интерфейс IDisposable для удаления приватной переменной _MailMessage
В этом же классе есть асинхронный метод, который использует закрытую переменную IDisposable, а именно async public Task<bool> Send
Мой вопрос: будет ли обычная реализация 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