我有一个实现 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
我没有看到你明确处置的任何地方_MailMessage
除了在Email.Dispose
.
async
没有做任何特别神奇的事情IDispose
;你唯一要记住的是async
方法可能会提前返回。
所以如果你这样称呼它:
using (var email = new Email(...))
{
await email.Send();
}
然后你的调用代码将(异步)等待Send
在处置之前完成email
。但如果你这样称呼它:
Task task;
using (var email = new Email(...))
{
task = email.Send();
}
然后你的调用代码将处理email
before Send
完成。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)