服务方法的并行调用
本文关键字:调用 并行 方法 服务 | 更新日期: 2023-09-27 18:07:02
我创建了一个WCF服务方法,它使用第三方服务方法(称为methodA
, methodB
, methodC
),这里所有三个服务都属于不同的服务,即serviceA
, serviceB
, serviceC
。
每个方法接受单个输入对象进行处理(不是输入对象列表)。但是我必须处理多个对象,所以我在for循环中使用这个方法。
现在的问题是,假设我有3个对象要用methodA
处理,2个对象要用methodB
处理,5个对象要用methodC
处理,并考虑每个方法需要1秒的处理时间,那么处理所有方法所花费的总时间几乎是10秒。为了克服这个问题,在谷歌搜索后,我得到了线程和并行linq等选项。当然,我对线程及其性能没有足够的了解,所以我选择远离它。现在使用并行linq,我发现性能提高了。但是仍然不能满足期望(有时会抛出超时异常)。
所以请建议我现在应该尝试什么?是否潜入线程或其他尝试?
由于TPL
一般或并行类也是解决方案,我建议您尝试使用TPL Dataflow
库,因为您的应用程序中有数据流动,这样您的代码将更加结构化。
因此,您可以创建3个ActionBlock<>
对象,每个对象对应您拥有的服务,并在循环中向它们发送数据。您还可以为它们添加任务延续处理程序,以便在服务使用所有消息时通知您。你也可以添加一个BufferBlock<T>
,并链接到其他的过滤器功能。代码将是这样的:
void ProducingMethod()
{
var serviceABlock = new ActionBlock<YourInputObject>(o =>
{
serviceA.Call(o);
});
serviceABlock.Completion.ContinueWith(t =>
{
sendNotifyA();
});
var serviceBBlock = new ActionBlock<YourInputObject>(o =>
{
serviceB.Call(o);
});
serviceBBlock.Completion.ContinueWith(t =>
{
sendNotifyB();
});
var serviceCBlock = new ActionBlock<YourInputObject>(o =>
{
serviceC.Call(o);
});
serviceCBlock.Completion.ContinueWith(t =>
{
sendNotifyC();
});
foreach (var objectToProcess in queue)
{
if (SendToA)
{
serviceABlock.SendAsync(objectToProcess);
}
else if (SendToB)
{
serviceBBlock.SendAsync(objectToProcess);
}
else if (SendToC)
{
serviceCBlock.SendAsync(objectToProcess);
}
}
}