【发布时间】:2018-03-12 17:52:59
【问题描述】:
当需要下订单时,我会使用这两个操作向管理员发送有关库存状态的电子邮件... 但是当我打电话给 SendEmailToAdminUser .. 需要时间和并排我不能使用其他功能...等待很长时间.. 我想将这些功能更改为异步并等待任务......但我不知道该怎么做。我试图从 JsonResult 更改为 ActionResult ...
public JsonResult SendEmailToAdminUser()
{
bool result = false;
var emails = UserEmails();
if (emails != null)
{
foreach (var email in emails)
{
var departmentId = context.Users.Where(e => e.Email == email)
.Select(s => s.DepartmentId).FirstOrDefault();
string departmentname = context.Departments.Where(u => u.deptId == departmentId)
.Select(n => n.DepartmentName).Single();
int[] ProductId = context.Inventory.Where(s => s.prId == departmentId)
.Where(s => s.Status == 10).Select(s => s.PrId).ToArray();
foreach (var product in ProductId)
{
string productname = context.Products.Where(n => n.prId == product)
.Select(n => n.ProductName).Single();
result = SendEmail(email, productname, "<p> Hi there, <br />It is time to order "
+ productname + " to department: " + departmentname + "</p> <br /> /Regards");
}
}
}
return Json(result, JsonRequestBehavior.AllowGet)
}
而我的 SendEmail 功能是:
public bool SendEmail(string toEmail, string subject, string emailBody)
{
try
{
string senderEmail = System.Configuration.ConfigurationManager.AppSettings["SenderEmail"].ToString();
string senderPassword = System.Configuration.ConfigurationManager.AppSettings["SenderPassword"].ToString();
SmtpClient client = new SmtpClient("smtp.gmail.com", 587);
client.EnableSsl = true;
client.Timeout = 100000;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.UseDefaultCredentials = false;
client.Credentials = new NetworkCredential(senderEmail, senderPassword);
MailMessage mailMessage = new MailMessage(senderEmail, toEmail, subject, emailBody);
mailMessage.IsBodyHtml = true;
mailMessage.BodyEncoding = UTF8Encoding.UTF8;
client.Send(mailMessage);
return true;
}
catch(Exception ex)
{
return false;
}
}
【问题讨论】:
-
使它
async不会对花费的时间产生任何影响(它只是意味着您释放线程以便它可以被其他请求使用) -
而你的
return Json(result, ...)没有多大意义。如果前 20 个失败,但最后一个成功,则您的方法返回true -
您可能会考虑将所有产品名称合并到一封电子邮件并发送给用户。至少这会将它从 O(M*N) 更改为 O(M) 调用
-
@StephenMuecke 所以你的意思是它还不错..?我有两个按钮.. + 和 - 增加和减少产品...当我单击减少按钮并且当产品状态减少到 10 然后它发送电子邮件...我不得不等待更多减少,我的减少发送电子邮件时按钮冻结。但它只是几秒钟..所以我可以忍受,,;)
标签: asp.net-mvc asynchronous async-await