【问题标题】:Parallel Invocation of service methods服务方法的并行调用
【发布时间】:2015-08-08 07:30:49
【问题描述】:

我已经创建了一个使用第三方服务方法的 WCF 服务方法(调用 methodAmethodBmethodC),这三个都属于不同的服务,即 serviceAserviceB、@987654326 @。

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

现在的问题是,假设我有 3 个对象要使用 methodA 处理,2 个对象要使用 methodB 处理,5 个对象要使用 methodC 处理,并考虑每个方法需要 1 秒来处理然后总时间处理所有内容几乎需要 10 秒。为了在谷歌搜索后克服这个问题,我得到了线程和并行 linq 等选项。当然我对线程及其性能没有足够的了解,我选择远离。现在使用并行 linq,我发现性能提高了。但是仍然没有满足期望(有时它会抛出超时异常)。
所以请建议我现在应该尝试什么?是潜入线程还是其他尝试?

【问题讨论】:

  • 看看Task Parallel Library
  • 我会说Parallel.Invoke 是您所需要的。你的代码将是Parallel.Invoke(()=>ServiceA.methodA(param1), ()=>Serviceb.methodB(param2), ()=>ServiceC.methodC(param3));
  • 我个人不明白你对这个suppose i have 3 objects to process with methodA, 2 objects to process with methodB and 5 objects to process with methodC 的意思。也许发布你的代码?
  • 原服务操作的调用者是否需要一定时间内的响应?他们需要回应吗?

标签: c# multithreading wcf plinq


【解决方案1】:

由于TPL 或 Parallel 类通常也是解决方案,我建议您尝试使用 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);
        }
    }
}

【讨论】:

    猜你喜欢
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多