Flujos de trabajo de máquina de estados
Una máquina de estados es un paradigma conocido para el desarrollo de programas. La actividad StateMachine , junto con State, Transition, y otras actividades se pueden usar para compilar programas de flujo de trabajo de máquina de estados. Este tema proporciona información general sobre cómo crear flujos de trabajo de máquina de estados.
Información general del flujo de trabajo de máquina de estados
Los flujos de trabajo de máquina de estados proporcionan un estilo de modelado con el que puede modelar su flujo de trabajo de una manera orientada a eventos. Una actividad StateMachine contiene los estados y las transiciones que constituyen la lógica de la máquina de estados, y se puede usar en cualquier lugar donde se puede usar una actividad. Hay varias clases en el tiempo de ejecución de máquina de estados:
Para crear un flujo de trabajo de máquina de estados, los estados se agregan a una actividad StateMachine y las transiciones se usan para controlar el flujo entre estados. En la captura de pantalla siguiente, del paso Procedimientos para crear un flujo de trabajo de máquina de estados del Tutorial de introducción, se muestra un flujo de trabajo de máquina de estados con tres estados y tres transiciones. Inicializar destino es el estado inicial y representa el primer estado del flujo de trabajo. Esto lo designa la línea que conduce a él desde el nodo Iniciar. El estado final del flujo de trabajo se denomina FinalState y representa el punto en el que se completa el flujo de trabajo.
Un flujo de trabajo de máquina de estados debe tener un único estado inicial y por lo menos un estado final. Cada estado que no es un estado final debe tener al menos una transición. Las secciones siguientes tratan sobre cómo crear y configurar estados y transiciones.
Crear y configurar estados
State representa un estado en el que una máquina de estados puede estar. Para agregar un elemento State a un flujo de trabajo, arrastre el diseñador de actividad State desde la sección Máquina de estados del Cuadro de herramientas y colóquelo en una actividad StateMachine en la superficie del Diseñador de flujo de trabajo de Windows.
Para configurar un estado como Estado inicial, haga clic con el botón secundario en el estado y seleccione Establecer como estado inicial. Además, si no hay ningún estado inicial actual, el estado inicial puede designarse arrastrando una línea del nodo Iniciar en la parte superior del flujo de trabajo al estado deseado. Cuando una actividad StateMachine se coloca en el diseñador de flujo de trabajo, está preconfigurada con un estado inicial denominado State1. Un flujo de trabajo de máquina de estados debe tener un único estado inicial.
Un estado que representa un estado de terminación en una máquina de estados se denomina un estado final. Un estado final es un estado que tiene su propiedad IsFinal establecida en true
, no tiene ninguna actividad Exit y ninguna transición procede de ella. Para agregar un estado final a un flujo de trabajo, arrastre un diseñador de actividad FinalState desde la Máquina de estados sección del Cuadro de herramientas y colóquelo en una actividad StateMachine en la superficie del Diseñador de flujo de trabajo de Windows. Un flujo de trabajo de máquina de estados debe tener al menos un estado final.
Configurar acciones de entrada y de salida
Un estado puede tener una acción Entry y una acción Exit. (Un estado configurado como estado final solo puede tener una acción de entrada). Cuando una instancia de flujo de trabajo entra en un estado, se ejecutan las actividades de la acción de entrada. Cuando se completa la acción de entrada, los desencadenadores de las transiciones del estado se programan. Cuando se confirma una transición a otro estado, las actividades de la acción de salida se ejecutan, incluso si el estado vuelve a cambiar al mismo estado. Después de que la acción de salida se completa, se ejecutan las actividades de la acción de la transición, se cambia al nuevo estado y se programan sus acciones de entrada.
Nota:
Al depurar un flujo de trabajo de máquina de estados, los puntos de interrupción se pueden colocar en la actividad de la máquina de estados raíz y los estados del flujo de trabajo de máquina de estados. Los puntos de interrupción no se pueden colocar directamente en las transiciones, pero pueden colocar en cualquier actividad contenida dentro de los estados y las transiciones.
Crear y configurar transiciones
Todos los estados deben tener al menos una transición, a excepción de un estado final, que no puede tener transiciones. Los cambios pueden agregarse después de agregar un estado a un flujo de trabajo de máquina de estados o se pueden crear cuando se coloca el estado.
Para agregar un elemento State y crear una transición en un paso, arrastre una actividad State desde la sección Máquina de estados del Cuadro de herramientas y mantenga el puntero sobre otro estado en el diseñador de flujo de trabajo. Cuando el State arrastrado está sobre a otro State, aparecerán cuatro triángulos alrededor del otro State. Si State se coloca sobre uno de los cuatro triángulos, se agrega a la máquina de estados y se crea una transición desde el State de origen al State de destino colocado. Para más información, consulte Diseñador de actividad de transición.
Para crear una transición después de agregar un estado, hay dos opciones. La primera opción es arrastrar el estado desde la superficie del diseñador de flujo de trabajo y mantener el mouse sobre un estado existente y colocarla en uno de los puntos de colocación. Esto es similar al método descrito en la sección anterior. También puede mantener el mouse sobre el estado de origen deseado y arrastrar una línea hasta el estado de destino deseado.
Nota:
Un solo estado en una máquina de estados puede tener hasta 76 transiciones creadas con el diseñador de flujo de trabajo. El límite de transiciones para un estado para los flujos de trabajo creados fuera del diseñador está limitado por los recursos del sistema.
Una transición puede tener Trigger, Condition y Action. El elemento Trigger de una transición se programa cuando se completa la acción Entry del estado de origen de la transición. Normalmente Trigger es una actividad que espera que se produzca algún tipo de evento, pero puede ser cualquier actividad o ninguna actividad. Una vez completada la actividad Trigger , se evalúa Condition, si existe. Si no hay ninguna actividad Trigger, Condition se evalúa inmediatamente. Si la condición se evalúa como false
, la transición se cancela y se reprograma la actividad Trigger para todas las transiciones desde el estado. Si hay otras transiciones que comparten el mismo estado de origen que la transición actual, esas acciones Trigger se cancelan y se reprograman también. Si Condition se evalúa como true
, o no hay ninguna condición, entonces la acción Exit del estado de origen se ejecuta y a continuación se ejecuta la Action de la transición. Cuando Action se completa, el control pasa al estado Target.
Las transiciones que comparten un desencadenador común se conocen como transiciones compartidas de desencadenador. Cada transición de un grupo de transiciones compartidas de desencadenador tiene el mismo desencadenador, pero una Condition y una acción únicas. Para agregar acciones adicionales a una transición y crear una transición compartida, haga clic en el círculo que indica el inicio de la transición deseada y arrástrelo hasta el estado deseado. La nueva transición compartirá un mismo desencadenador que la transición inicial, pero tendrá una condición y una acción únicas. Las transiciones compartidas también se pueden crear desde el diseñador de transición haciendo clic en Agregar transición de desencadenador compartida en la parte inferior del diseñador de transición y mediante la selección del estado de destino deseado en la lista desplegable Estados disponibles para conectar.
Nota:
Tenga en cuenta que si la condición Condition de una transición se evalúa en False
(o todas las condiciones de una transición de desencadenador compartido se evalúan en False
), la transición no se producirá y se reprogramarán todos los desencadenadores para todas las transiciones desde el estado.
Para obtener más información sobre cómo crear flujos de trabajo de máquina de estados, vea Procedimientos para crear un flujo de trabajo de máquina de estados, Diseñador de actividades StateMachine, Diseñador de actividades State, Diseñador de actividades FinalState Activity y Diseñador de actividades Transition.
Terminología de la máquina de estados
Esta sección define el vocabulario de la máquina de estados usado en este tema.
State
La unidad básica que compone una máquina de estados. Una máquina de estados puede estar en un estado en un momento dado.
Acción de entrada
Actividad que se ejecuta cuando se entra en el estado
Acción de salida
Actividad que se ejecuta cuando se sale del estado
Transición
Una relación dirigida entre dos estados que representa la respuesta completa de una máquina de estados en una aparición de un evento de un tipo determinado.
Transición compartida
Una transición que comparte un estado y un desencadenador de origen con una o más transiciones, pero tiene una condición y una acción únicas.
Desencadenador
Una actividad de desencadenamiento que produce una transición.
Condición
Una restricción que se debe evaluar como true
después de que se produzca el desencadenador para que se complete la transición.
Acción de transición
Una actividad que se ejecuta al realizar cierta transición.
Transición condicional
Una transición con una condición explícita.
Transición a sí mismo
Una transición que transita de un estado a sí mismo.
Estado inicial
Un estado que representa el punto inicial de la máquina de estados.
Estado final
Un estado que representa la finalización de la máquina de estados.