gpt4 book ai didi

c# - 并行调用服务方法

转载 作者:太空宇宙 更新时间:2023-11-03 13:02:40 26 4
gpt4 key购买 nike

我制作了一个 WCF 服务方法,它使用第三方服务方法(调用 methodAmethodBmethodC),这三个都属于不同的服务,即 serviceA , serviceB , serviceC .

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

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

最佳答案

作为 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);
}
}
}

关于c# - 并行调用服务方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31890798/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com