with-statement with async calls | Cancle操作?

C4d*_*C4d 7 c# dispose asynchronous using-statement

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

想象一下这样的结构:

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

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

    client.SendAsync(mail);
}
Run Code Online (Sandbox Code Playgroud)

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

对此有一般性的答案吗?这里的服务器速度太快,不知道怎么做试用.


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

Tho*_*que 12

您可以使用SendMailAsync返回a 的新方法Task,并等待该任务:

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

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

    await client.SendMailAsync(mail);
}
Run Code Online (Sandbox Code Playgroud)

这将确保客户端在SendMailAsync完成之前不会被丢弃.

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

  • @ C4u no,`await`将*释放*线程,等待异步操作完成,然后恢复执行. (3认同)