0

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

それらを同時に実行し、最終結果、処理結果、および各ポートから個別に発生する例外を結合する必要があります。これを行う方法を教えてください。

PortSet からではなく、Port からの結果に参加する唯一の可能性を見つけることができました。

ありがとう

4

1 に答える 1

0

ソリューションは、関係するクラスの数によっていくらか制限されます。それぞれ、および各ハンドラーで完了ポートへのChoiceレシーバーをアクティブ化することをお勧めします。完了ポートでは、すべて完了したときにaを使用できます。したがって、頭のてっぺんから派生していると仮定します(そうでない場合は、terserの代わりに使用する必要があります)。PortSetPostJoinCcrServiceBaseArbiter.ActivateActivate

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
        }
    })
于 2010-09-20T01:15:04.207 に答える