我是TPL(任务并行库)的新手,我很难配置我的进程并行运行任务.
我正在开发一个发送批量电子邮件的应用程序(例如每分钟数千个,这就是这个想法),但当我看到处理器性能时,它并不好:我很确定有很多开销因为我没有使用任务库正确.
这是我的代码:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
(我知道它可能看起来很糟糕:请随意烤我☺)
我需要它以这种方式行事:我需要批处理一些记录(顺便说一句,我使用的库允许我使用"批处理"方法),因为我需要将一批记录标记为在进程完成发送时在数据库中处理.
这个过程实际上正在做我想要的事情:除了地狱之外很慢.正如你在perfmon中看到的那样,处理器的工作能力不是很高:

最好的方法是什么?有什么建议?
编辑:我意识到我所拥有的是一个开销问题.是否有任何工具或简单的方法来检测和纠正它们?