C#中的Parallel.ForEach - 我错过了什么?

时间:2013-04-01 01:53:14

标签: .net .net-4.0 task-parallel-library

我试图弄清楚为什么我要尝试构建(使用TPL)并没有按预期工作。

以下是该场景:我有一堆服务请求类,它们通过中央服务处理器,并返回服务结果对象。有时我需要为单个"呼叫"执行多个(我在2到5之间)请求。所以我有这样的事情:

ServiceRequestType1 Request1 = new ServiceRequestType1();
ServiceRequestType2 Request2 = new ServiceRequestType2();
ServiceRequestType3 Request3 = new ServiceRequestType3();
ServiceRequestType4 Request4 = new ServiceRequestType4();

ServiceProcessor sp = new ServiceProcessor();

ServiceResultType1 = sp.ProcessType1(Request1);
ServiceResultType2 = sp.ProcessType2(Request2);
ServiceResultType3 = sp.ProcessType3(Request3);
ServiceResultType4 = sp.ProcessType4(Request4);

// do stuff with the ServiceResult objects...

这4个请求在本地计算机上同步运行时 - 即使在访问数据库中的数据时,所有进程都非常快速(通常每个不到10毫秒)。我对这种表现很满意。但随着时间的推移,随着数据库大小的增长和性能的下降,我想看看是否可以使用Parallel.ForEach()在并行的大致相同的时间内运行多个请求。

所以我设置了类似的东西:

ConcurrentBag<ServiceResultBase> results = new ConcurrentBag<ServiceResultBase>();

Parallel.ForEach<IServiceRequest>(request.Requests, serviceRequest =>
{
   ServiceResultBase serviceResult = ExecuteServiceRequest(serviceRequest);
   results.Add(serviceResult);
});

正如我现在正在测试的那样,问题是我的结果非常不一致。有时,所有请求都在一起运行,并且所有4个请求都在&lt;总共10毫秒。其他一些请求在&lt; 10毫秒,但其他人需要超过3000毫秒,然后有时一个或多个将花费超过30,000毫秒运行。有时,一个或多个请求根本无法完成。我试图调试并找到导致这种情况的根本原因,但到目前为止,很难说出问题出在哪里以及为什么Parallel.ForEach对我这样做。

使用.ForEach()时,我应该注意哪些问题或选项?我在这里阅读了其他一些引用TPL的帖子,但与我遇到的情况完全不同。

1 个答案:

答案 0 :(得分:1)

它肯定与TPL无关,问题在于您用于访问数据库的库,还是数据库本身,与表/行锁有关的某种或并发问题。使用SQL事件探查器检查查询的执行情况,并从那里开始。