Cómo: Crear y ejecutar un flujo de trabajo de larga ejecución
Este tema es aplicable a Windows Workflow Foundation 4.
Una de las características principales de Windows Workflow Foundation (WF) es la capacidad del tiempo de ejecución de conservar y descargar flujos de trabajo inactivos en una base de datos. En este tema se muestra cómo crear la base de datos local para la persistencia del flujo de trabajo y cómo habilitarla en una aplicación de flujo de trabajo.
Nota: |
---|
Cada uno de los temas del tutorial de introducción depende de los temas anteriores. Para completar este tema, primero debe finalizar Cómo: Crear una actividad, Cómo: Crear flujos de trabajo y Cómo: Ejecutar un flujo de trabajo. |
Para crear la base de datos de persistencia
Abra SQL Server Management Studio y conéctese al servidor local. Haga clic con el botón secundario en el nodo Bases de datos en el servidor local y seleccione Nueva base de datos. Asigne a la nueva base de datos el nombre Persistence, acepte el resto de valores y seleccione Aceptar.
Nota: Asegúrese de que tiene el permiso Crear base de datos en el servidor local antes de intentar crear una base de datos nueva. Haga clic con el botón secundario en la nueva base de datos Persistence y seleccione Nueva consulta. Abra la carpeta siguiente: C:\Windows\Microsoft.NET\Framework\<versión actual>\sql\en. Arrastre los siguientes archivos a la ventana de consulta y ejecútelos en el siguiente orden:
SqlWorkflowInstanceStoreSchema.sql
SqlWorkflowInstanceStoreLogic.sql
Para habilitar la persistencia en una aplicación de flujo de trabajo
Haga clic con el botón secundario en WorkflowConsoleApplication1 en el Explorador de soluciones y seleccione Agregar referencia.
Seleccione System.Activities.DurableInstancing y System.Runtime.DurableInstancing en la pestaña .NET y haga clic en Aceptar.
Abra Program.cs (Module1.vb para Visual Basic) en el proyecto WorkflowConsoleApplication1. En la clase
Program
(Module1
para Visual Basic), declare una constante de cadena que defina una cadena de conexión en la base de datos de persistencia que creó en el primer procedimiento.Const connectionString As String = "Server=.\\SQLEXPRESS;Initial Catalog=Persistence;Integrated Security=SSPI"
const string connectionString = "Server=.\\SQLEXPRESS;Initial Catalog=Persistence;Integrated Security=SSPI";
Nota: Según la edición de SQL Server, el nombre de servidor de cadena de conexión puede ser diferente. A continuación, agregue una instrucción using o Imports para
System.Activities.DurableInstancing
en el archivo Program.cs o Module1.vb.Imports System.Activities.DurableInstancing
using System.Activities.DurableInstancing;
En el método
Main
que sigue al código que crea WorkflowApplication, cree SqlWorkflowInstanceStore y asígnelo a InstanceStore de WorkflowApplication.Dim inputs As New Dictionary(Of String, Object) inputs.Add("MaxNumber", 100) Dim wfApp As New WorkflowApplication(New Workflow1(), inputs) Dim store As New SqlWorkflowInstanceStore(connectionString) wfApp.InstanceStore = store
WorkflowApplication wfApp = new WorkflowApplication(new Workflow1(), inputs); SqlWorkflowInstanceStore store = new SqlWorkflowInstanceStore(connectionString); wfApp.InstanceStore = store;
A continuación, indique al flujo de trabajo que conservar cuando esté inactivo. Para ello, reemplace el delegado para el evento
Idle
que se agregó en el tema anterior y sustitúyalo con el siguiente código que administra PersistableIdle.' Replace the Idle handler with a PersistableIdle handler. 'wfApp.Idle = _ ' Sub(e As WorkflowApplicationIdleEventArgs) ' idleEvent.Set() ' End Sub wfApp.PersistableIdle = _ Function(e As WorkflowApplicationIdleEventArgs) idleEvent.Set() Return PersistableIdleAction.Persist End Function
// Replace the Idle handler with a PersistableIdle handler. //wfApp.Idle = delegate(WorkflowApplicationIdleEventArgs e) //{ // idleEvent.Set(); //}; wfApp.PersistableIdle = delegate(WorkflowApplicationIdleEventArgs e) { idleEvent.Set(); return PersistableIdleAction.Persist; };
Nota: La enumeración PersistableIdleAction tiene tres valores: None, Persist y Unload. Persist provoca que el flujo de trabajo se mantenga pero no causa la descarga del flujo de trabajo. Unload hace que el flujo de trabajo se conserve y se descargue. Una vez descargada la instancia, se elimina WorkflowApplication y se necesita un nuevo objeto WorkflowApplication para la interacción siguiente con el flujo de trabajo descargado. En este tema se usa Persist
de manera que el flujo de trabajo se quede en la memoria y no se elimine WorkflowApplication. Para ver un ejemplo de uso de la clase WorkflowApplication con el valor de enumeración Unload, vea el ejemplo Conservar una aplicación de flujo de trabajo.Al final del método
Main
, agregue las siguientes líneas de código. WorkflowApplication descarga automáticamente la instancia de flujo de trabajo de la memoria cuando el juego se haya completado y quita el registro de persistencia de la base de datos.Console.WriteLine("Press any key to continue . . .") Console.ReadKey()
Console.WriteLine("Press any key to continue . . ."); Console.ReadKey();
Nota: Cuando el flujo de trabajo se completa, se quita el registro de persistencia correspondiente al flujo de trabajo. En este ejemplo, sin Console.ReadKey, la aplicación host saldría inmediatamente cuando el flujo de trabajo se completara. Dado que la limpieza de persistencia se produce en un subproceso en segundo plano, no tendría la oportunidad de completar su trabajo si el host finalizara antes de que la limpieza terminara. Otra manera de evitar que el host se cierre antes de que la operación de persistencia se complete es que el host se bloquee hasta que el evento Unloaded se produzca después de que se haya completado el flujo de trabajo. Una vez finalizado el flujo de trabajo, no se descarga hasta que se completa el trabajo en segundo plano, como la eliminación del flujo de trabajo completado de la persistencia. Para probar la persistencia, presione F5 para iniciar la aplicación y volver a SQL Server Management Studio. Expanda el nodo de la base de datos Persistence (o el nodo de la base de datos Master si creó las tablas de persistencia en la base de datos maestra) y el nodo Tablas dentro de la base de datos Persistence. Haga clic con el botón secundario en la tabla InstancesTable y haga clic en Seleccionar las primeras 1000 filas. Se debería mostrar una fila con el id. del flujo de trabajo conservado.
A continuación, siga jugando para completar el flujo de trabajo. Cuando se haya cerrado el juego, vuelva a SQL Server Management Studio y ejecute de nuevo la consulta. Tenga en cuenta que no se devuelve ningún registro de persistencia.
Ha completado el tutorial de introducción.