我试图弄清楚为什么我试图构建的(使用 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 的帖子,但与我所经历的完全不同。