Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何对数据库或服务进行批远程调用?_C#_Multithreading_Ccr_Task Parallel Library - Fatal编程技术网

C# 如何对数据库或服务进行批远程调用?

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()); } }

希望你们中的一些人能在这个问题上给出一些建议

我生成的代码必须调用远程资源,如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
    } 
}
类父{
数不清的孩子;
int SumChildren(){
//注意门冬酰胺
返回Children.aspallel().Sum(c=>c.RemoteCall());
}   
}
类子{
公共int RemoteCall(){
//打一些网络服务。我想把这些电话集中起来
//无需重写此代码的其余部分
} 
}
对于50个孩子,它将给服务打50个电话,花费50倍的开销。在我现实生活中的例子中,这很容易就是一百万个电话,把整个事情弄得一团糟

我想做的是以某种对调用线程/任务透明的方式批处理这些调用。因此,它不是直接调用服务,而是调用一些中央队列(“火车站”),对这些调用进行批处理

因此,当它这样做时,调用任务会阻塞。然后,队列等待X个调用累积,然后使用请求列表对远程服务进行1次调用

当结果出现时,此队列将返回值返回到正确的任务并取消阻止它。对于调用线程,所有这些都保持隐藏状态,看起来就像是另一个函数调用

这能做到吗?TPL中是否有原语允许我这样做

它闻起来有点像CCR,有很多事情在同时进行,等待其他事情完成

我当然可以重写这段代码,在父类上创建请求列表,然后调用服务。问题是,对于我真正的问题,所有这些代码都是生成的。因此,我必须“深入研究”Child.RemoteCall的实现,使这一切比现在复杂得多。此外,子对象可能是远程对象的代理等。如果可行的话,这将非常困难,我宁愿隔离这种复杂性

希望这对某人有意义,如果不让我知道,我会详细说明

因此,当它这样做时,调用任务会阻塞。然后,队列等待X个调用累积

如果队列接收到x个调用(x=x。如果只有一个任务想要进行N*x个调用,则它将被卡住

如果您的应用程序通常有很多任务在运行,那么您可能只会间歇性地看到这个问题—您的负载异常低,或者完全关闭

您可以通过添加超时来解决此问题,这样,如果在时间限制内未添加任何请求,并且/或者第一个请求的等待时间超过了时间限制,队列仍将发送批处理请求

我当然可以重写这段代码,在父类上创建请求列表,然后调用服务

也许你的方法是正确的。您能否找到一种方法,通过委托、继承、lambda方法或增强生成器,将生成的方法实现替换为手工编码的实现


。。。对于我真正的问题,所有这些代码都是生成的

我不太清楚的一点是,生成了代码的哪些部分(很难修改),以及可以修改代码的哪些部分来解决这个问题

  • Child.RemoteCall()
  • Parent.SumChildren()
  • 以上两项都没有
  • 如果以上两个都不是,那么你必须能够修改一些东西来解决问题。父实例和子实例是否由AbstractFactory构建?如果是这样,则可以向子实例插入一个代理,该代理可用于修改其行为的非功能方面。

    (使用答案框表示空格)

    谢谢你的想法

    “这会使……” 我处理从存储库生成的代码。当处理这个问题的手工编码示例时,开发人员可以发现并改进它。通过生成代码,很难从问题的一组示例中提取出一般情况。这会变得相当复杂,所以我的策略是分而治之。如果我要看一看走出家门的孩子的功能

    “我找到了这个链接…” 我看过Futures,但这更像是一种分叉机制,当有空闲线程时,它可以被并行化

    第三方物流似乎是将工作分解成小块。我想做的是把这些位中的一部分放在一个不同的组合中,然后将它们重新拆分,以便并行执行。(我想,心里还在想着这个……)

    “再想一想”: 再一次,魔鬼与征服战略让我走到了这一步。所以我把较大的问题分成小块,解决它们,然后把小块重新组合起来。我喜欢想象一个蚁群,每个蚂蚁都遵循简单的规则(或看板,这是一个类似的原则),而不是一些中央管理的东西(查询优化器),它们很快陷入困境,因为它变得非常复杂,非常快

    当父级可以以并行方式调用50个子级时,这些单独的任务就可以批处理在一起,因为它们指向同一个远程资源,这将非常好

    这里的主要障碍是如何让调用任务(或线程或其他执行单元)阻塞,让另一个任务为一批任务拾取工作,然后执行,将答案放入集合中,所有任务将其工作放入其中,然后再次唤醒它们。(然后以有效的方式……)

    我想我记得George Chrysanthakopoulos(创建CCR的人)说过,收益率-回报声明是他用来处理这种事情的。我会在第九频道再找那个采访

    JOBHANDLE X= GetJobId();
    //single job
    AddJob(JOBHANLDE X,ChildJob y);
    //container of jobs
    AddJobs(JOBHANDLE x, ChildJobs Y);
    
    BeginAsyncExecute(JOBHANDLE X);
    WaitTillResult(JOBHANDLE X);