with-statement with async calls | Cancle操作?

时间:2016-06-14 12:54:50

标签: c# asynchronous dispose using-statement

我面临着一个普遍的问题,我无法找到一个很好的例子来为自己尝试。谷歌不是一个帮助。

想象一下这样的结构:

MailMessage mail = new MailMessage(sender, receiver);
using(SmtpClient client = new SmtpClient())
{
    client.Host ...
    client.Port ...

    mail.subject ...
    mail.body ...

    client.SendAsync(mail);
}

如果服务器很慢并且需要一段时间来接受邮件,该怎么办?操作完成之前是否可能放置SmtpClient?它会以任何方式被卷入或破坏吗?

这是否有一般性答案?这里的服务器速度太快,不知道如何进行试用。

如果考虑取消BackgroundWorker,它总是完成当前的操作。可以在这里相同,也可以不是......

1 个答案:

答案 0 :(得分:12)

您可以使用返回SendMailAsync的较新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完成之前不会处理客户端。

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