|
Página 5 de 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:
- Páginas de Microsoft Robotics Studio
- Cómo encontrar artículos sobre consciencia y robótica
- Robótica Cognitiva y Conciencia Artificial
- Robótica Cognitiva
- Robots Polimórficos
- Microsoft Robotics Studio Octubre 2006 CTP
- Microsoft Robotics Studio Noviembre 2006 CTP
- Robotics Studio 1.0 Liberado
- Simulador RoboCup para Robotics Studio
- Robotics Studio 1.5 Mayo 2007 CTP
Add as favourites (60) | Cite este artículo en su sitio | Views: 1620 | E-Mail
Solo los usuarios registrados pueden agregar sus comentarios. Por favor, vaya a login, o regístrese.
|