我制作了一个使用第三方服务方法的WCF服务方法(来电methodA
,methodB
,methodC
),这三个属于不同的服务,即{{1} },serviceA
,serviceB
。
每个方法接受单个输入对象进行处理(不是输入对象列表)。但是我必须处理多个对象,所以我在for循环中使用这个方法。
现在的问题是,假设我有3个对象要处理serviceC
,2个对象要处理methodA
,5个对象要处理methodB
并考虑每个方法需要1秒处理然后处理全部所花费的总时间几乎是10秒。为了在谷歌搜索后克服这个问题,我得到了诸如线程和parallel-linq之类的选项。当然,我对线程及其性能没有足够的了解,我选择远离它。现在使用并行linq我发现性能提升了。但仍然没有满足期望(有时它的抛出超时例外)
那么请建议我现在应该尝试什么?是否潜入线程或其他任何尝试?
答案 0 :(得分:1)
由于TPL
一般或者并行类都是解决方案,我建议您试用TPL Dataflow
库,因为您的应用程序中有数据流,您的代码将更加结构化方式。
因此,您可以创建3个ActionBlock<>
对象,每个对象用于您拥有的服务,并在循环中将数据发布到它们。您还可以为它们添加任务延续处理程序,以便通知您,然后服务将使用所有消息。您还可以使用过滤功能添加BufferBlock<T>
和link it to other ones。代码将是这样的:
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);
}
}
}