使用带有异步调用的语句 |取消操作?

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 完成之前被释放。

(当然,这意味着您的方法现在也必须是异步的)