使用带有异步调用的语句 |取消操作?
Using-statement with async call | Cancel operation?
我遇到了一个普遍的问题,我找不到一个好的例子来亲自尝试。 Google 也无济于事。
想象一下这样的结构:
MailMessage mail = new MailMessage(sender, receiver);
using(SmtpClient client = new SmtpClient())
{
client.Host ...
client.Port ...
mail.subject ...
mail.body ...
client.SendAsync(mail);
}
如果服务器很慢,需要一段时间才能接受邮件怎么办。 SmtpClient
是否有可能在操作完成之前被处理掉?它会以任何方式被取消或破坏吗?
这个有通用的答案吗?这里的服务器太快了,不知道怎么试。
如果考虑取消 BackgroundWorker
它总是在完成当前操作。这里可能相同,也可能不同...
您可以使用更新的 SendMailAsync
方法,即 returns 和 Task
,并等待该任务:
MailMessage mail = new MailMessage(sender, receiver);
using(SmtpClient client = new SmtpClient())
{
client.Host ...
client.Port ...
mail.subject ...
mail.body ...
await client.SendMailAsync(mail);
}
这将确保客户端不会在 SendMailAsync
完成之前被释放。
(当然,这意味着您的方法现在也必须是异步的)
我遇到了一个普遍的问题,我找不到一个好的例子来亲自尝试。 Google 也无济于事。
想象一下这样的结构:
MailMessage mail = new MailMessage(sender, receiver);
using(SmtpClient client = new SmtpClient())
{
client.Host ...
client.Port ...
mail.subject ...
mail.body ...
client.SendAsync(mail);
}
如果服务器很慢,需要一段时间才能接受邮件怎么办。 SmtpClient
是否有可能在操作完成之前被处理掉?它会以任何方式被取消或破坏吗?
这个有通用的答案吗?这里的服务器太快了,不知道怎么试。
如果考虑取消 BackgroundWorker
它总是在完成当前操作。这里可能相同,也可能不同...
您可以使用更新的 SendMailAsync
方法,即 returns 和 Task
,并等待该任务:
MailMessage mail = new MailMessage(sender, receiver);
using(SmtpClient client = new SmtpClient())
{
client.Host ...
client.Port ...
mail.subject ...
mail.body ...
await client.SendMailAsync(mail);
}
这将确保客户端不会在 SendMailAsync
完成之前被释放。
(当然,这意味着您的方法现在也必须是异步的)