希望你们中的一些人可以就这一点给出一些指示。
我生成代码,我必须调用远程资源,如 web 服务或数据库。
考虑这段代码
class Parent{
IEnumerable<Child> Children;
int SumChildren() {
// note the AsParallel
return Children.AsParallel().Sum(c => c.RemoteCall());
}
}
class Child {
public int RemoteCall() {
// call some webservice. I'd like to pool these calls
// without having to rewrite the rest of this code
}
}
对于 50 个孩子,它将调用 50 次服务,占用 50 倍的开销。在我现实生活中的例子中,这很容易是一百万个调用,使整个事情变得爬行。
我想做的是以某种对调用线程/任务透明的方式批处理这些调用。因此,它不是直接调用服务,而是调用一些对这些调用进行批处理的中央队列(“火车站”)。
因此,当它这样做时,调用任务会阻塞。然后队列等待 X 调用累积,然后使用请求列表对远程服务进行 1 次调用。
当结果出现时,该队列将返回值返回给正确的任务并解除阻塞。对于调用线程,所有这些都保持隐藏,看起来就像另一个函数调用。
这可以做到吗?TPL 中是否有原语可以让我这样做?
它有点像 CCR 的气味,有很多事情在同时进行,等待其他事情完成。
我当然可以重写此代码以在 Parent 类上创建请求列表,然后调用该服务。问题是我的真正问题是生成了所有这些代码。因此,我必须“深入了解” Child.RemoteCall 的实现,这使得这一切变得比现在复杂得多。此外,孩子可能是远程对象等的代理。如果可行的话,这将非常困难,我宁愿隔离这种复杂性。
希望这对某人有意义,如果不让我知道,我会详细说明。