ソリューションは、関係するクラスの数によっていくらか制限されます。それぞれ、および各ハンドラーで完了ポートへのChoice
レシーバーをアクティブ化することをお勧めします。完了ポートでは、すべて完了したときにaを使用できます。したがって、頭のてっぺんから派生していると仮定します(そうでない場合は、terserの代わりに使用する必要があります)。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
したがって、新しいを作成する呼び出しの代わりにPortSet
、コモンを提供し、PortSet
それをGetData
メソッドに提供します。
これで、複数のアイテムの受信を実行できます。
ps.MultipleItemReceive(4,
responses=> {
foreach(var response in responses)
{
//process response
}
},
exceptions=> {
foreach(var exception in exceptions)
{
//process exception
}
})