gpt4 book ai didi

c# - 通过SmtpClient异步发送邮件的两种方式,不同的结果

转载 作者:太空狗 更新时间:2023-10-29 18:20:36 26 4
gpt4 key购买 nike

这里是简单的概念。这是针对使用 MVC 3 和 Entity Framework 4 构建的网站。用户在网站上注册后,会向他们的电子邮件地址发送一封电子邮件。我首先使用 SmtpClient.Send() 实现了它并且它工作正常。然后我想到了尝试异步发送电子邮件的好主意。我在使用我尝试过的两种异步方法时遇到了问题。

第一次实现(来自这个未答复的帖子:https://stackoverflow.com/questions/7558582/how-to-dispose-using-smtpclient-send-and-asynccallback):

public bool Emailer(){
.
.
.
using (var smtpClient = new SmtpClient())
{
smtpClient.EnableSsl = true;
smtpClient.Host = "smtp.gmail.com";
smtpClient.Port = 587;
smtpClient.UseDefaultCredentials = false;
smtpClient.Credentials = new NetworkCredential("myaddress@gmail.com", "mypassword");

var sd = new SendEmailDelegate(smtpClient.Send);
var cb = new AsyncCallback(SendEmailResponse);
sd.BeginInvoke(message, cb, sd);

return true;
}
}

private delegate void SendEmailDelegate(System.Net.Mail.MailMessage m);

private static void SendEmailResponse(IAsyncResult ar)
{
try
{
SendEmailDelegate sd = (SendEmailDelegate)(ar.AsyncState);
sd.EndInvoke(ar); // "cannot access a disposed object" errors here
}
catch (Exception e)
{
_logger.WarnException("Error on EndInvoke.", e);
}
}

这成功了一半。另一半我会在 CallBack 中收到“无法访问已处置的对象”错误。

下一步实现(来自信誉良好的成员:What are best practices for using SmtpClient, SendAsync and Dispose under .NET 4.0):

var smtpClient = new SmtpClient();
smtpClient.EnableSsl = true;
smtpClient.Host = "smtp.gmail.com";
smtpClient.Port = 587;
smtpClient.UseDefaultCredentials = false;
smtpClient.Credentials = new NetworkCredential("myaddress@gmail.com", "mypassword");

smtpClient.SendCompleted += (s, e) =>
{
smtpClient.Dispose();
message.Dispose();
};
smtpClient.SendAsync(message, null);

通过此实现,我没有收到任何错误,但是当 smtpClient.SendAsync() 执行时,在 Debug模式下有明显更长的延迟(~5 秒),这让我认为它不是异步发送的。

问题:

1) 导致“处理对象”错误的第一个方法有什么问题?

2) 第二种实现是否存在导调用子邮件无法异步发送的问题? 5秒的延迟没有意义吗?

可能还需要注意的是,虽然该网站不需要支持发送大量电子邮件(仅用户注册、选择加入新闻通讯等),但我们确实预计 future 会有大量用户,因此我决定异步发送电子邮件。

谢谢。

最佳答案

由于 USING block ,您的第一个方法将无法正常工作。 using-block 结束后,SmtpClient 对象将被销毁。因此您无法在事件处理程序中访问它。

关于c# - 通过SmtpClient异步发送邮件的两种方式,不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8768863/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com