我需要以异步方式向我的网站用户发送约5000封电子邮件作为时事通讯。.问题是我不知道异步发送它们的最佳方法..请帮助我更新代码以使其异步
我的代码:
public string SendEmail()
{
foreach (var emailAddress in EmailList)
{
var message = new MailMessage("[email protected]", emailAddress);
message.Subject = "hi";
SmtpClient client = new SmtpClient("smtp.gmail.com", 587);
client.Credentials = new NetworkCredential("[email protected]", "*****");
client.EnableSsl = true;
client.Send(message);
}
return "done";
}
谢谢露西
看一下async
andawait
关键字。
https://msdn.microsoft.com/zh-CN/library/mt674882.aspx
C#中的async和await关键字是异步编程的核心。通过使用这两个关键字,您可以使用.NET Framework或Windows Runtime中的资源来创建异步方法,几乎就像创建同步方法一样容易。通过使用async和await定义的异步方法称为异步方法。
MSDN解释了事物的语法方面。更大的顾虑是错误处理和可靠。将5,000封电子邮件发送到列表中并单击它们上的“发送”按钮有点乐观。这些电子邮件是否需要可靠地传递?如果其中有3,000个发送,并且网络错误突然导致到传出邮件服务器的临时连接丢失,会发生什么情况?重新启动后,您要重新发送全部5,000吗?只是忘记最后的2,000个?收件人是因为收到重复邮件而生气还是根本没有收到邮件?您将如何解决错误?
我发现一种非常有效的模式(无论是同步发送还是异步发送),都是生成消息并将每个消息存储在数据库表中,然后使用类似以下的内容:
public void SendAllEmails()
{
var emails = SomeClass.GetAllUnsentEmails();
foreach(Email message in Emails)
{
var success = SendEmail(message);
if (!success)
{
// Do you want to do something if it fails?
}
}
}
public bool SendEmail(Email message)
{
try
{
// 1. Send the email message
// 2. Update the "SentOn" date in the database
// 3. return true
}
catch(Exception ex)
{
SomeClass.CreateEmailErrorEntry(message, ex); // store error in a table or log
return false;
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句