質問

私には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);

それらを同時に実行し、各ポートから発生する最終結果、処理結果、例外に参加する必要があります。これを行うにはどうすればよいですか?

ポートセットの結果ではなく、ポートの結果に参加する可能性だけを見つけることができました。

ありがとう

役に立ちましたか?

解決

あなたのソリューションは、関係するクラスの数によって多少制限されています。アクティブ化することをお勧めします Choice それぞれの受信機 PortSet, 、および各ハンドラーに Post 完了ポートまで。完了ポートでは、aを使用できます 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
        }
    })
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top