首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在CCR中加入PortSet

在CCR中加入PortSet
EN

Stack Overflow用户
提问于 2010-09-15 17:00:19
回答 1查看 150关注 0票数 0

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

代码语言:javascript
复制
PortSet<Response1, Exception> GetData1(Request1 request);
PortSet<Response2, Exception> GetData2(Request2 request);
PortSet<Response3, Exception> GetData3(Request3 request);
PortSet<Response4, Exception> GetData4(Request4 request);

我需要并发运行它们,并分别连接来自每个端口的最终结果、处理结果和异常。你能建议我怎么做吗?

我只能找到加入Port的结果的可能性,而不是PortSet的结果。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-09-20 09:15:04

您的解决方案在某种程度上受到所涉及的类数量的限制。我建议在每个PortSet上激活Choice接收器,并在每个处理程序中Post到一个完成端口。在完成端口上,你可以使用Join当它们都是complete.So的时候,假设你是从CcrServiceBase派生的(否则你需要使用Arbiter.Activate而不是更简洁的Activate):

代码语言:javascript
复制
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类型,你可以按如下方式组织你的调用:

代码语言:javascript
复制
var PortSet<Response,Exception> ps=new PortSet<Response,Exception>();
GetData1(request1,ps);
GetData2(request2,ps);
GetData3(request3,ps);
GetData4(request4,ps);

因此,您可以提供一个通用的PortSet并将其提供给GetData方法,而不是使用GetData调用来创建新的PortSet

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

代码语言:javascript
复制
ps.MultipleItemReceive(4,
    responses=> {
        foreach(var response in responses)
        {
            //process response
        }
    },
    exceptions=> {
        foreach(var exception in exceptions)
        {
            //process exception
        }
    })
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3716129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档