|
Page 5 of 5
Podemos incluir otro ejemplo, en el que se ve la utilidad de Arbiter.Interleave:
class SampleService { Dispatcher dispatcher = new Dispatcher(0, "Sample Service"); DispatcherQueue taskQueue = new DispatcherQueue(); Port<string> pState = new Port<string>(); ServicePort pMain = new ServicePort(); ServicePort InitStatefull() { dispatcher.AddQueue(taskQueue); pState.Post("Hello"); Arbiter.Activate(taskQueue, Arbiter.Interleave( new TeardownReceiverGroup(Arbiter.Receive(false, pMain, Shutdown)), new ExclusiveReceiverGroup(Arbiter.Receive(true, pMain, Update)), new ConcurrentReceiverGroup(Arbiter.Receive(true, pMain, GetState))) ); return pMain; } }
En este ejemplo vemos que se han seguido los mismos pasos que en el ejemplo anterior. La diferencia es que añadimos un método (InitStatefull()) que devuelve un objeto de la clase ServicePort y en él usamos Arbiter.Interleave, que nos proporciona garantías de protección hasta que el proceso halla terminado. Los tres parámetros que toma Interleave son:
- TearDownReceiverGroup: se añaden las tareas que hay que realizar sólo una vez al terminar todo.
- ExclusiveReceiverGroup: se ponen las tareas que se tienen que ejecutar en serie (sin concurrencia).
- ConcurrentReceiverGroup: se ponen las tareas que se pueden ejecutar en paralelo sin problemas (porque no tienen dependencias de datos entre ellas).
Un ejemplo más concreto del uso de Interleave sería el siguiente:
Port<WebResponse> responsePort = null; Port<Exception> failurePort = null; for (Int32 n = 0; n < c_ImageUrls.Length; n++) { WebRequest webReq = WebRequest.Create(c_ImageUrls[n]); ApmToCcrAdapters.GetResponse(webReq, ref responsePort, ref failurePort);}
Arbiter.Activate( dq, Arbiter.Interleave( new TeardownReceiverGroup (Arbiter.Receive (false, failurePort, delegate(Exception e) {Msg("At least 1 GetResponse failed");})),
new ExclusiveReceiverGroup(),
new ConcurrentReceiverGroup(Arbiter.Receive(true, responsePort,delegate(WebResponse response) {Byte[] data = new Byte[response.ContentLength]; response.GetResponseStream().Read(data, 0, data.Length); Msg("RequestUri={0}", response.ResponseUri); }) )));
Podemos comprobar en este ejemplo que en la llamada al método Interleave tenemos los tres parámetros citados anteriormente. En concreto, primero se crea una instancia de TeardownReceiverGroup, que ejecutará el receptor de la clase Arbiter una vez acabado todo. Si saltara la excepción, mostraría un mensaje por pantalla: "At least 1 GetResponse failed". En cuanto al segundo parámetro: ExclusiveReceiverGroup, no incluye ninguna tarea para ser ejecutada. Por último, el parámetro ConcurrentReceiverGroup, ejecutará el receptor del puerto de respuesta (responsePort), que no tiene dependencia con ningún dato.
Comparte tus dudas, comentarios o sugerencias en el Foro de Robotics Studio en Español.
Related Items:
- Microsoft Robotics Studio Pages
- Finding papers about consciousness and robotics
- Cognitive Robotics
- Polymorphic Robotics
- Microsoft Robotics Studio October 2006 CTP
- Microsoft Robotics Studio November 2006 CTP
- Robotics Studio 1.0 Released
- RoboCup Simulator for Robotics Studio
- Robotics Studio 1.5 May 2007 CTP
- Robotics Studio 1.5 Released
Add as favourites (56) | Quote this article on your site | Views: 1358 | E-mail
Only registered users can write comments. Please login or register. Powered by AkoComment Tweaked Special Edition v.1.4.4
|