我有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);我需要并发运行它们,并分别连接来自每个端口的最终结果、处理结果和异常。你能建议我怎么做吗?
我只能找到加入Port的结果的可能性,而不是PortSet的结果。
谢谢
发布于 2010-09-20 09:15:04
您的解决方案在某种程度上受到所涉及的类数量的限制。我建议在每个PortSet上激活Choice接收器,并在每个处理程序中Post到一个完成端口。在完成端口上,你可以使用Join当它们都是complete.So的时候,假设你是从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);因此,您可以提供一个通用的PortSet并将其提供给GetData方法,而不是使用GetData调用来创建新的PortSet。
现在,您可以执行多项接收:
ps.MultipleItemReceive(4,
responses=> {
foreach(var response in responses)
{
//process response
}
},
exceptions=> {
foreach(var exception in exceptions)
{
//process exception
}
})https://stackoverflow.com/questions/3716129
复制相似问题