1

我试图弄清楚为什么我试图构建的(使用 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 个请求总共在 < 10 毫秒内执行。有时,一些请求的运行时间小于 10 毫秒,但其他请求的运行时间超过 3000 毫秒,有时一个或多个请求的运行时间超过 30,000 毫秒。有时一个或多个请求根本无法完成。我正在尝试调试并找到其根本原因,但到目前为止,很难说出问题出在哪里以及为什么 Parallel.ForEach 对我来说是这样的。

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

4

1 回答 1

1

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

于 2013-04-01T02:04:46.853 回答