【发布时间】:2013-11-25 12:01:35
【问题描述】:
我们已经实现了需要处理传入批次的应用程序。例如,必须将一组特定对象类型的请求发送到特定的 Web 服务以对其进行处理
我们已经实现了以下 sn-p 来做到这一点。如果有任何陷阱,需要您的帮助/指导
var options = new ParallelOptions { MaxDegreeOfParallelism = 10 };
Parallel.ForEach(request, options, currentRequest =>
{
ProcessedRequest processedRequest = null;
try
{
currentRequest.DBSave = true;
processedRequest = CommunicateToService(currentRequest);
}
catch (Exception ex)
{
ExceptionManager.HandleException(ex);
}
});
在 CommunicateToservice 方法中,我们将调用服务并传递请求并获取响应对象并将大约 10 -15 个表保存到 MS SQL DB。整个方法被 AggregateException 包裹着。
需要有关如何确定 MaxDegreeOfParallelism 值的意见。
【问题讨论】:
-
如果这确实是在处理一批类似的项目,您可能希望将该批次传递给服务一次,并让服务处理多线程。甚至可能对 sql 使用批处理,因此它在一个进程中,但仍然比线程快。线程,特别是如果每个线程都在做繁重的工作,并不一定比良好的批处理快。
-
Communicatetoservice 方法调用外部服务进行响应,并在到达时将其保存到数据库。我的意思是方法处理多线程
-
也许批量发送所有请求,处理它们并将它们一批保存到数据库中会更快。大多数数据库都有非常高效的批处理 API,而且您没有多次服务调用的开销。但只有你自己知道这样会不会更快。
标签: c# task-parallel-library plinq