代码之家  ›  专栏  ›  技术社区  ›  Kosau

加入CCR中的端口集

ccr
  •  0
  • Kosau  · 技术社区  · 14 年前

    我有4个服务,每个服务都有一个签名如下的方法:

    PortSet<Response1, Exception> GetData1(Request1 request);
    PortSet<Response2, Exception> GetData2(Request2 request);
    PortSet<Response3, Exception> GetData3(Request3 request);
    PortSet<Response4, Exception> GetData4(Request4 request);
    

    我只能找到从端口而不是从端口集加入结果的可能性。

    1 回复  |  直到 14 年前
        1
  •  0
  •   spender    14 年前

    您的解决方案受到所涉及的类的数量的限制。我建议激活 Choice 每个接收器 PortSet Post 到一个完工港。在完成端口上,您可以使用 Join 当他们都完成了。所以呢从我的头顶上,假设你是从 CcrServiceBase Arbiter.Activate 而不是更简洁 Activate ):

    var cPort=new Port<EmptyValue>();
    Activate(GetData1(myRequest1)
        .Choice(r1=>{
            Process(r1);
            cPort.Post(EmptyValue.SharedInstance);
        },ex=>{
            Process(ex);
            cPort.Post(EmptyValue.SharedInstance);
        }); //etc 4 times
    
    Activate(cPort.Join(4,e=>{
        //all completed. Proceed here...
    }));
    

    如果你有一个共同的 Response 键入,则可以按以下方式构造调用:

    var PortSet<Response,Exception> ps=new PortSet<Response,Exception>();
    GetData1(request1,ps);
    GetData2(request2,ps);
    GetData3(request3,ps);
    GetData4(request4,ps);
    

    所以不是 GetData 端口集 端口集 并提供给 方法。

    现在,您可以执行多项目接收:

    ps.MultipleItemReceive(4,
        responses=> {
            foreach(var response in responses)
            {
                //process response
            }
        },
        exceptions=> {
            foreach(var exception in exceptions)
            {
                //process exception
            }
        })
    
    推荐文章