小编Sil*_*tre的帖子

使批量发送电子邮件并行的最佳方法

我是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中看到的那样,处理器的工作能力不是很高:

在此输入图像描述

最好的方法是什么?有什么建议?

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

.net c# parallel-processing task-parallel-library .net-4.5

3
推荐指数
1
解决办法
2902
查看次数