2010-09-15 2 views
0

У меня есть 4 услуг, каждый из них имеет метод с подписью, как это:Регистрация на подмножестве портов-х в CCR

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.

Благодаря

ответ

0

Ваше решение несколько ограничено числом классов, участвующих. Я предлагаю активировать приемники Choice на каждом PortSet и в каждом обработчике до Post до порта завершения. На порте завершения, вы могли бы использовать Join, когда они все complete.So, с верхней части моей головы, и предполагается, что вы выводе из CcrServiceBase (в противном случае вы должны будете использовать Arbiter.Activate вместо terser 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 
     } 
    }) 
+0

Спасибо за ответ! Да, меня как-то ограничивает количество различных ответов, которые я получаю, и именно поэтому я задал этот вопрос :). К сожалению, я должен придерживаться разных результатов, поскольку они поступают из разных источников (разные даже по своей природе, поскольку некоторые из них будут выполнять веб-запрос, другие будут называть веб-службу, а некоторые - в базу данных). Таким образом, первое решение подходит для меня, спасибо! – Kosau

Смежные вопросы