C# 如何对数据库或服务进行批远程调用?
希望你们中的一些人能在这个问题上给出一些建议 我生成的代码必须调用远程资源,如Web服务或数据库 考虑一下这段代码C# 如何对数据库或服务进行批远程调用?,c#,multithreading,ccr,task-parallel-library,C#,Multithreading,Ccr,Task Parallel Library,希望你们中的一些人能在这个问题上给出一些建议 我生成的代码必须调用远程资源,如Web服务或数据库 考虑一下这段代码 class Parent{ IEnumerable<Child> Children; int SumChildren() { // note the AsParallel return Children.AsParallel().Sum(c => c.RemoteCall()); } }
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
}
}
类父{
数不清的孩子;
int SumChildren(){
//注意门冬酰胺
返回Children.aspallel().Sum(c=>c.RemoteCall());
}
}
类子{
公共int RemoteCall(){
//打一些网络服务。我想把这些电话集中起来
//无需重写此代码的其余部分
}
}
对于50个孩子,它将给服务打50个电话,花费50倍的开销。在我现实生活中的例子中,这很容易就是一百万个电话,把整个事情弄得一团糟
我想做的是以某种对调用线程/任务透明的方式批处理这些调用。因此,它不是直接调用服务,而是调用一些中央队列(“火车站”),对这些调用进行批处理
因此,当它这样做时,调用任务会阻塞。然后,队列等待X个调用累积,然后使用请求列表对远程服务进行1次调用
当结果出现时,此队列将返回值返回到正确的任务并取消阻止它。对于调用线程,所有这些都保持隐藏状态,看起来就像是另一个函数调用
这能做到吗?TPL中是否有原语允许我这样做
它闻起来有点像CCR,有很多事情在同时进行,等待其他事情完成
我当然可以重写这段代码,在父类上创建请求列表,然后调用服务。问题是,对于我真正的问题,所有这些代码都是生成的。因此,我必须“深入研究”Child.RemoteCall的实现,使这一切比现在复杂得多。此外,子对象可能是远程对象的代理等。如果可行的话,这将非常困难,我宁愿隔离这种复杂性
希望这对某人有意义,如果不让我知道,我会详细说明
因此,当它这样做时,调用任务会阻塞。然后,队列等待X个调用累积
如果队列接收到x个调用(x。。。对于我真正的问题,所有这些代码都是生成的 我不太清楚的一点是,生成了代码的哪些部分(很难修改),以及可以修改代码的哪些部分来解决这个问题
JOBHANDLE X= GetJobId();
//single job
AddJob(JOBHANLDE X,ChildJob y);
//container of jobs
AddJobs(JOBHANDLE x, ChildJobs Y);
BeginAsyncExecute(JOBHANDLE X);
WaitTillResult(JOBHANDLE X);