У меня есть класс, который реализует интерфейс IDisposable для размещения частной переменной. _MailMessage
. В том же классе есть метод async, который использует переменную private IDisposable, а именно async public Task<bool> Send
. Вопрос: Будет ли нормальный Реализация IDisposable удаляет закрытую переменную после завершения асинхронного метода? Вот пример класса я говорю:async/await и IDisableable
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
Спасибо за ваш ответ. Как узнать, является ли личная переменная неуправляемым типом? Интерфейс IDispose наследуется в интерфейсе IEmail, поэтому это должно быть хорошо, я думаю. Что вы имеете в виду: «Вы не можете назвать это сами». Где я сам это называю? –
Я изменил реализацию IDisposable в соответствии с вашим ответом, эффективно удалив деструктор. Но является ли IDisposable совершенно ненужным? И если да, то почему? –
Нет, это не лишнее, так как вы * имеете * одноразовый член. У вас есть объект MailMessage. –