En este articulo profundizaremos un poco más acerca de los métodos disponibles en el Runtime, su sintaxis y su uso en Workflow Foundation.
La clase WorkflowRuntime
El runtime del flujo de trabajo es el intermediario entre la aplicación host y las instancias del flujo de trabajo. Aunque el flujo de trabajo es una parte muy importante de Windows Workflow Foundation, el runtime juega un papel muy importante en el ciclo de vida de los flujos de trabajo. La clase System.Workflow.Runtime.WorkflowRuntime representa el runtime del flujo de trabajo y proporciona una gran funcionalidad para manejar el ambiente del runtime. Utilizando esta clase, se tiene control absoluto de la ejecución de las instancias del flujo de trabajo y del runtime mismo. La clase System.Workflow.Runtime.WorkflowRuntime es responsable de varias tareas que son muy importantes. Una de ellas es la de el manejo de eventos del runtime que acabamos de ver en la sección anterior. Otra de ellas es la gestión del Runtime.
Gestión del Runtime
La clase WorkflowRuntime expone dos métodos públicos que se relacionan con la gestión del runtime del flujo de trabajo: StartRuntime y StopRuntime.
El método StartRuntime permite que se ejecuten dos importantes acciones. Primero, existen servicios base del runtime que siempre deben existir en un flujo de trabajo del runtime: un servicio de transacción del flujo de trabajo y un servicio planificador del flujo de trabajo. Cuando se llama a este método, se realice una validación para revisar si alguno de estos dos servicios ha sido añadido manualmente al runtime. Si no, el runtime crea instancias de default para cada tipo de servicio. La clase por default del servicio de transacción es DefaultWorkflowTransactionService, y la clase por default del servicio de planificación es DefaultWorkflowSchedulerService. Después de que los servicios se agregaron e instanciaron exitosamente al runtime, cada servicio es iniciado con el método Start. Adicionalmente a la configuración de los servicios que ocurre durante el proceso de arranque del runtime, a la propiedad IsStarted del runtime se le da el valor true, y se genera el evento Started Started.
Llamar al método StopRuntime tiene el efecto contrario. Se detienen todos los servicios, se descargan todas las instancias de flujos de trabajo, a la propiedad IsStarted se le da el valor false, y se genera el evento Stopped event. La Tabla 2 nos muestra los diferentes métodos de trabajo existentes en el workflow Runtime:
| Método | Descripción |
| CreateWorkflow | Crea una instancia del flujo de de trabajo utilizando los parámetros especificados. |
| GetAllServices | Regresa todos los servicios que han sido agregados al engine del runtime del flujo de trabajo que derivan del tipo especificado. |
| GetLoadedWorkflows | Obtiene una colección que contiene todas las instancias de flujos de trabajo actualmente cargadas en memoria. |
| GetService | Obtiene un servicio del engine del runtime del flujo de trabajo que usa el tipo especificado. |
| GetWorkflow | Obtiene las instancia del flujo de trabajo que tiene el Guid especificado. |
| RemoveService | Quita el servicio especificado del engine del runtime del flujo de trabajo. |
| StartRuntime | Inicia el engine del runtime del flujo de trabajo y los servicios del engine del runtime del flujo de trabajo. |
| StopRuntime | Detiene el engine del runtime del flujo de trabajo y los servicios del engine del runtime del flujo de trabajo. |
Tabla 2. Métodos del Workflow Runtime
Iniciar y manejar instancias del Workflow
Una de las tareas más importantes que el runtime puede realizar es iniciar instancias del flujo de trabajo. Adicionalmente a iniciar las instancias, el runtime expone la funcionalidad para manejarlos. Para manejar una instancia del flujo de trabajo, simplemente hay que llamar el método CreateWorkflow de la instancia WorkflowRuntime. Existen muchas formas de llamar a este método, pero el más comúnmente usado es el que usa una instancia Type, que representa el tipo de la clase de flujo de trabajo. Por ejemplo:
//MiWorkflow es la definición de clase del workflow
Type workflowType = typeof(MiWorkflow);
// usa el runtime del workflow runtime para crear una instancia de MiWorkflow
WorkflowInstance workflowInstance =
theRuntimeInstance.CreateWorkflow(workflowType);
Aunque el código anterior crea una instancia del flujo de trabajo, en realidad no inicia el flujo de trabajo. El método Start method de la clase WorkflowInstance es la que lo hace, como se puede ver en el siguiente código:
// inicia la instancia del flujo de trabajo
workflowInstance.Start();
En el siguiente ejemplo podemos ver la ejecución de los métodos StartRuntime y StopRuntime del WorkFlowRuntime junto con el método Start para la instancia del flujo de trabajo:
Main()
{
string connectionString = "Initial Catalog=SqlPersistenceService;Data Source=localhost;Integrated Security=SSPI;";
using (WorkflowRuntime workflowRuntime = new WorkflowRuntime())
{
ExternalDataExchangeService dataService = new ExternalDataExchangeService();
workflowRuntime.AddService(dataService);
dataService.AddService(expenseService);
workflowRuntime.AddService(new SqlWorkflowPersistenceService(connectionString));
workflowRuntime.StartRuntime();
workflowRuntime.WorkflowCompleted += OnWorkflowCompleted;
workflowRuntime.WorkflowTerminated += OnWorkflowTerminated;
Type type = typeof(EjemploWorkflow1);
WorkflowInstance workflowInstance = workflowRuntime.CreateWorkflow(type);
workflowInstance.Start();
waitHandle.WaitOne();
workflowRuntime.StopRuntime();
}
}