|
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.
Add as favourites (126) | Quote this article on your site | Views: 4460
Only registered users can write comments. Please login or register.
Related Items:
- Jobs: Two Chair positions for new Centre for Computational Neuroscience and Co
- Birmingham Fellows in Robotics and Cognitive Systems
- Finding papers about consciousness and robotics
- Paladyn. Journal of Behavioral Robotics
- International Journal of Social Robotics
- Cognitive Robotics and Machine Consciousness
- Cognitive Robotics
- Polymorphic Robotics
- Urbi goes Open Source
- The Tower of Hanoi for Robotics
|