并行调用服务方法

时间:2015-08-08 07:30:49

标签: c# multithreading wcf plinq

我制作了一个使用第三方服务方法的WCF服务方法(来电methodAmethodBmethodC),这三个属于不同的服务,即{{1} },serviceAserviceB

每个方法接受单个输入对象进行处理(不是输入对象列表)。但是我必须处理多个对象,所以我在for循环中使用这个方法。

现在的问题是,假设我有3个对象要处理serviceC,2个对象要处理methodA,5个对象要处理methodB并考虑每个方法需要1秒处理然后处理全部所花费的总时间几乎是10秒。为了在谷歌搜索后克服这个问题,我得到了诸如线程和parallel-linq之类的选项。当然,我对线程及其性能没有足够的了解,我选择远离它。现在使用并行linq我发现性能提升了。但仍然没有满足期望(有时它的抛出超时例外) 那么请建议我现在应该尝试什么?是否潜入线程或其他任何尝试?

1 个答案:

答案 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);
        }
    }
}