在我的应用程序中,我有一个保存和发布文章的功能。所以,当我点击"保存并发布"按钮发生了三件事:
现在接收电子邮件的用户数量可能会有所不同,例如10,30,50等。我想异步发送通知电子邮件,以便在所有邮件都没有发送给接待员之前,页面不会被阻止。
以下是来自" PublishArticle"的一段代码。行动方法
foreach (string to in emailIds)
{
ArticleNotificationDelegate proc = Email.Send;
IAsyncResult asyncResult = proc.BeginInvoke(subject, body, to, from, cc, null, null, null);
}
下面我定义了一个委托来调用Send
方法
private delegate bool ArticleNotificationDelegate (string subject, string body, string to, string from, string cc, string bcc = null);
这是发送电子邮件的代码:
public static bool Send(string subject, string body, string to, string from, string cc, string bcc = null)
{
bool response;
MailMessage mail = new MailMessage();
MailAddress fromAddress = new MailAddress(from);
mail.To.Add(to);
if (!string.IsNullOrWhiteSpace(cc))
{
mail.CC.Add(cc);
}
if (!string.IsNullOrWhiteSpace(bcc))
{
mail.Bcc.Add(bcc);
}
mail.From = fromAddress;
mail.Subject = subject;
mail.Body = body;
mail.IsBodyHtml = true;
mail.Priority = MailPriority.High;
SmtpClient client = new SmtpClient();
try
{
client.Send(mail);
response = true;
}
catch (Exception)
{
response = false;
}
finally
{
client.Dispose();
mail.Dispose();
}
return response;
}
虽然这段代码工作正常,但我仍然想知道我的这种方法是否合适,以后不会引起任何问题。
如果有更好的方法来实现我的目标,那么请建议我。
注意:由于我使用的是.net framework 4.0,因此无法使用4.5中提供的Asyn
和await
的新功能。
我还使用了方法client.SendAsync
,只需替换client.Send
,我上面的Send
方法中的其余代码都是相同的。在这个改变之后没有发送邮件,也没有任何例外。所以我没有接受这种改变。
答案 0 :(得分:1)
我想异步发送通知电子邮件,以便在所有邮件都没有发送给接待员之前,页面不会被阻止。
这是一种非常危险的方法,因为如果没有活动请求,ASP.NET会随意拆除您的应用程序域。 ASP.NET不知道您已将工作排队到其线程池(通过BeginInvoke
)。我建议您使用HangFire之类的解决方案可靠地发送电子邮件。