|
Page 2 of 5 Podemos poner un sencillo ejemplo de todo lo visto anteriormente:
Port<int> portInt = new Port<int>(); // 1 portInt.Post(10); // 2 Console.WriteLine(portInt.ItemCount); // 3
Dispatcher dispatcher = new Dispatcher(0, "sample dispatcher"); // 4 DispatcherQueue taskQueue = new DispatcherQueue("sample queue", dispatcher);//5
Arbiter.Activate(taskQueue, Arbiter.Receive( false, portInt, delegate(int item) {Console.WriteLine("Received item:" + item);})); // 6
port.Post(5); //7
La explicación del código anterior, es la siguiente:
1- Creamos un puerto que acepta instancias de tipo System.Int32 (int).
2- Añadimos el número 10 al puerto usando el método Post().
3- Mostramos por pantalla el número de elementos que contiene el puerto.
4- Creamos un objeto de la clase Dispatcher con 0 hilos, esto lo que hace es que el CCR crea un hilo para cada CPU por defecto.
5- Se crea una instancia DispatcherQueue, (es decir, una cola de proceso), pasándole cómo parámetros el nombre “sample queue” y una referencia de la clase Dispatcher, creada anteriormente.
6- Realizamos una llamada al método Activate de la clase Arbiter, pasándole cómo parámetros: una referencia de la clase DispatcherQueue, creada anteriormente. Un nuevo elemento Arbiter (mediador), en este caso, al usar el método Receive, este mediador está a la escucha en el puerto “portInt”, creado también anteriormente. Además se pasa un delegado (o método anónimo), que será el encargado de la ejecución cuando se añada un elemento al puerto en cuestión. Nota: El método Activate, sirve para registrar el Arbiter indicado.
7- El elemento (entero 5) ya se ha añadido al puerto, se pasa a la ejecución del delegado.
Cuando el elemento se ha enviado al puerto con un receptor, lo que ocurre dentro de la implementación del puerto es lo siguiente:
1- Se crea un contenedor para el valor fijado. La clase contenedor, IPortElement, permite que el CCR encole los elementos y asigne a cada elemento la tarea correspondiente, independientemente del tipo de elemento. 2- El contenedor es encolado.
3- Si la lista de recibidores no es nula y hay al menos un recibidor, el puerto podrá llamar al método ReceiverTask. Evaluate que decide, junto con el mediador, si el elemento puede ser consumido (es decir, ejecutado por el método o delegado especificado).
4- El puerto llama al método taskQueue.Enqueue con la tarea devuelta en la ejecución de Evaluate en el receptor.
|