Вопрос

У меня есть 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's.

Спасибо

Это было полезно?

Решение

Ваше решение несколько ограничено количеством задействованных классов. Я бы предложил активировать Choice приемники на каждом 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
        }
    })
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top