【问题标题】:Using-statement with async call | Cancel operation?使用异步调用的语句 |取消操作?
【发布时间】:2016-10-15 05:22:49
【问题描述】:

我面临一个普遍的问题,我找不到一个很好的例子来亲自尝试。 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,它总是会完成当前操作。这里可能是一样的,也可能不是……

【问题讨论】:

  • 是的,此代码在发送电子邮件之前处理client。这可能很糟糕。

标签: c# asynchronous dispose using-statement


【解决方案1】:

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

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

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

    await client.SendMailAsync(mail);
}

这将确保在 SendMailAsync 完成之前不会释放客户端。

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

【讨论】:

  • 根据你的最后一句话,await 会阻塞我的线程,对吧?
  • @C4u 不,await释放线程,等待异步操作完成,然后恢复执行。
  • @AvnerShahar-Kashtan 哇哦。然后我得到了我想要的一切。非常感谢你们两个:)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多