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

7

我面对一个普遍性问题,但我找不到一个好的例子来让自己尝试一下。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,它总是会完成当前的操作。可能在这里也一样,也可能不是...

2
是的,这段代码在发送电子邮件之前将会处理掉“client”。这可能不太好。 - spender
1个回答

12
你可以使用更新的SendMailAsync方法,该方法返回一个Task,并等待该任务完成:

你可以使用更新的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完成之前,客户端不会被处理。

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


根据你之前的句子,await会阻塞我的线程,对吗? - C4d
3
不,await释放线程,等待异步操作完成,然后恢复执行。 - Avner Shahar-Kashtan
@AvnerShahar-Kashtan 哇,太棒了。那我找的一切都有了。非常感谢你们两个 :)。 - C4d

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接