服务方法的并行调用

本文关键字:调用 并行 方法 服务 | 更新日期: 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);
        }
    }
}