Я новичок в TPL (Task Parallel Library), и мне сложно с трудом настроить мой процесс для запуска задач параллельно.Лучший способ отправить рассылку писем по электронной почте параллельно
Я работаю над приложением для отправки массовых писем (например, тысячи в минуту, это идея), но когда я вижу производительность процессоров, это не хорошо: Я уверен, что есть много накладных расходов Я не правильно использую библиотеку задач.
Вот мой код:
public async void MainProcess()
{
var batches = emailsToProcess.Batch(CONST_BATCHES_SIZE);
foreach (var batch in batches.AsParallel()
.WithDegreeOfParallelism(Environment.ProcessorCount))
{
await Task.WhenAll(from emailToProcess in batch
select ProcessSingleEmail(emailToProcess));
_emailsToProcessRepository.MarkBatchAsProcessed(batch);
}
}
private async Task ProcessSingleEmail(EmailToProcess emailToProcess)
{
try
{
MailMessage mail = GetMail(emailToProcess); //static light method
await _smtpClient.SendAsync(sendGridMail);
emailToProcess.Processed = true;
}
catch (Exception e)
{
_logger.Error(ErrorHelper.GetExceptionMessage(e,
string.Format("Error sending Email ID #{0} : ",
emailToProcess.Id)), e);
}
}
(я знаю, что это может выглядеть ужасно: пожалуйста, не стесняйтесь жарить меня ☺)
мне нужно вести себя так: Мне нужно, чтобы обработать количество записей в пакете (btw, я использую библиотеку, которая позволяет мне использовать метод «Batch»), поэтому мне нужно отметить пакет записей, обработанных в базе данных, когда процесс завершает их отправку.
Процесс на самом деле делает то, что я хочу: кроме slow as hell. И как вы можете видеть в PerfMon, процессоры не работают с очень высокой производительностью:
Какой самый лучший способ сделать это? Любой совет?
EDIT: Я понимаю, что у меня есть накладная проблема. Есть ли какой-нибудь инструмент или простой способ их обнаружить и исправить?
Я ожидаю, что ограничивающий фактор является вашей пропускной способностью сети, а не ваш процессора ... распараллелить свои процессоры все, что вам нужно, не даст вам более быстрого сетевого подключения. – abelenky
@abelenky Спасибо за ваш ответ, но я не думаю, что это проблема. Я даже попытался заменить SendAsync на Task.Delay (1500), что примерно соответствует отправке электронной почты, и результат был точно таким же. – Silvestre
Конечно, ваша сеть является ограничивающим фактором здесь, но я думаю, вы можете сделать больше, чем '.WithDegreeOfParallelism (Environment.ProcessorCount)' здесь, потому что вы пытаетесь быть асинхронным (немного экспериментируйте) - кроме этого вам, возможно, придется попробовать out альтернативы структурам Smtpclient ... btw: какой объемной электронной почты это будет? У нас достаточно спама;) – Carsten