Для задач ввода-вывода, таких как отправка электронной почты, вы не хотите использовать Parallel
. Это удваивается, если вы работаете на ASP. NET. Кроме того, вы не хотите использовать new Thread
, если не выполняете COM-взаимодействие.
Если вы хотите сделать его асинхронным, самый простой способ - оставить все как есть и просто вместо этого вызвать SendAsync
из Send
:
var sb = new StringBuilder();
using (var mc = new SmtpClient() {
Host = "127.0.0.1", // Current HMailServer installation - will be changed to external API
DeliveryMethod = SmtpDeliveryMethod.Network,
Port = 25,
UseDefaultCredentials = false,
Credentials = new NetworkCredential("Username", "Password")
})
{
foreach(var result in GetData())
{
using(var mm = new MailMessage())
{
mm.To.Add(new MailAddress(result.Email, result.FirstName + " " + result.Surname));
mm.Subject = "Your monthly report";
mm.From = new MailAddress("noreply@example.com");
mm.ReplyToList.Add(new MailAddress("admin@example.com"));
// Email body constructed here for each individual recipient
mm.Body = sb.ToString();
sb.Clear();
await mc.SendAsync(mm);
}
}
}
Теперь, если вы хотите сделать это одновременно , тогда вы захотите использовать Task.WhenAll
:
using (var mc = new SmtpClient() {
Host = "127.0.0.1", // Current HMailServer installation - will be changed to external API
DeliveryMethod = SmtpDeliveryMethod.Network,
Port = 25,
UseDefaultCredentials = false,
Credentials = new NetworkCredential("Username", "Password")
})
{
var tasks = GetData().Select(async result =>
{
using(var mm = new MailMessage())
{
mm.To.Add(new MailAddress(result.Email, result.FirstName + " " + result.Surname));
mm.Subject = "Your monthly report";
mm.From = new MailAddress("noreply@example.com");
mm.ReplyToList.Add(new MailAddress("admin@example.com"));
var sb = new StringBuilder();
// Email body constructed here for each individual recipient
mm.Body = sb.ToString();
await mc.SendAsync(mm);
}
});
await Task.WhenAll(tasks);
}
(обратите внимание, что StringBuilder
больше не является общим)
Я не использовал SMTP API SendGrid в масштабе, но я столкнулся с их REST API со значительным количеством запросов.