邮件发送耗时过长,使用SendAsync是否会导致提前断开连接问题?
你的担忧完全正确,你当前写的SendAsync后直接接Disconnect的代码必然存在隐患:SendAsync是异步非阻塞调用,执行完方法后会立刻返回执行后续代码,此时邮件发送请求还没处理完,Disconnect就会直接切断连接,大概率导致邮件发送失败。
正确的实现方案分两种场景:
方案1:适配支持async/await的.NET框架(推荐)
直接用await关键字等待异步发送操作完成,既不会阻塞当前线程解决页面无响应问题,也能保证发送完成后再执行断开逻辑,代码示例:
// 包含该代码的方法需要标记为 async,返回值改为 Task 或 Task<T> await client.SendAsync(message); client.Disconnect(true);
方案2:适配不支持async/await的旧版本框架
通过注册SendCompleted事件回调的方式,在发送操作完成后再执行断开逻辑,代码示例:
// 注册发送完成事件回调 client.SendCompleted += (sender, args) => { // 此处可添加发送结果判断、日志记录等自定义逻辑 client.Disconnect(true); client.Dispose(); }; // 启动异步发送 client.SendAsync(message, null);
注意事项
- 不要在同步方法中对
SendAsync的返回值调用.Wait()或.Result,否则会回到同步阻塞的状态,还可能引发线程死锁。 - 建议添加异常捕获逻辑,针对邮件发送失败的场景做降级处理(比如重试、记录错误日志等)。
- 正确的异步实现不会占用请求线程等待邮件发送结果,完全可以解决你现在遇到的页面8秒无响应问题。
内容的提问来源于stack exchange,提问作者CodeXennial
相关产品推荐
相关产品推荐

