workflow foundation 4 - tutorial - Flujo de trabajo de Windows 4: diferencia entre WorkflowApplication Cancelar, finalizar y cancelar
windows workflow foundation visual studio 2017 (2)
¿Puede alguien explicar cuál es la diferencia entre los siguientes métodos de WorkflowApplication:
Cancelar Cancelar Terminar
Después de investigar más a fondo este problema, quiero resumir las diferencias:
Terminar :
- Se activará el evento Completado de la aplicación de flujo de trabajo.
- el CompletionState (WorkflowApplicationCompletedEventArgs) tiene un error
- El evento Unloaded de la aplicación de flujo de trabajo se activará.
- el flujo de trabajo se completa
- OnBodyCompletado en la actividad se llamará
Cancelar:
- Se activará el evento Completado de la aplicación de flujo de trabajo.
- el estado de finalización (WorkflowApplicationCompletedEventArgs) está cancelado
- El evento Unloaded de la aplicación de flujo de trabajo se activará.
- el flujo de trabajo se completa
- OnBodyCompletado en la actividad se llamará
Abortar:
- Se desencadenará el evento Aborted de la aplicación de flujo de trabajo.
- el flujo de trabajo no se completa
Una excepción no controlada
- desencadena OnUnhandledException
- en este administrador de eventos, el valor de retorno (de tipo UnhandledExceptionAction) determina lo que sucederá a continuación:
- UnhandledExceptionAction.Terminate terminará la instancia de flujo de trabajo
- UnhandledExceptionAction.Cancel cancelará la instancia de flujo de trabajo
- UnhandledExceptionAction.Abort abortará la instancia de flujo de trabajo
- Cada uno activará los eventos correspondientes explicados anteriormente.
Actualización: la interrupción no parece desencadenar la descarga de la instancia en el almacén de persistencia de SQL. Así que me parece que es mejor usar Cancelar o Terminar y, si tiene que realizar alguna acción en función del estado de finalización, puede marcar CompletionState en el evento Completo.
Primero, felicitaciones a Steffen Opel (y sus comentarios a continuación). No pude captar que mi publicación original linked documentation que era específica de WF 3.5 . Hizo un poco más de cavar alrededor.
Para la posteridad, he dejado mi respuesta anterior debajo, etiquetada como WF3.5 . Consulte WF4.0 para ver algunas notas relacionadas con la cancelación, el aborto y la terminación en WF4.0.
WF4.0
Desafortunadamente, hay poca documentación explícita que discute las diferencias en Cancelar, Cancelar y Terminar en WF4.0. Sin embargo, a partir de la documentation method member ,
- En Abortar, a) la actividad se detiene inmediatamente, b) se invoca el controlador abortado, yc) el controlador completado no se invoca.
- En Cancelar, a) se le da un período de gracia a la actividad para que se detenga correctamente después de que se emita una TimeoutException, b) Se invoca el controlador completado.
- En Terminar, a) la actividad recibe un período de gracia para detenerse con gracia luego de que se emita una TimeoutException, b) Se invoca el controlador completado.
Las diferencias entre Abortar y Cancelar / Terminar son bastante sorprendentes. Simplemente llame a Abortar para matar un flujo de trabajo directamente. La diferencia entre Cancelar y Terminar es más matizada. Cancelar no requiere ningún tipo de razón (es un método sin parámetros que no es válido), mientras que Terminar requiere una razón (ya sea en cadena o en formato de excepción).
En todos los casos, el tiempo de ejecución del flujo de trabajo no realizará ninguna acción implícita en su nombre (es decir, los flujos de trabajo no se autodestruirán automáticamente a la terminación WF3.5). Sin embargo, con la excepción altamente personalizable / manejo de eventos expuesta por el tiempo de ejecución, cualquiera de estas características puede implementarse con relativa facilidad.
WF3.5
Cancelado
Según la documentation linked
Una actividad se pone en el estado de Cancelación explícitamente por una actividad principal, o porque se lanzó una excepción durante la ejecución de esa actividad.
Aunque la cancelación se puede usar para detener un flujo de trabajo completo (es decir, invocado en la actividad raíz), por lo general se usa para detener partes discretas de un flujo de trabajo (es decir, como recuperación de errores o como una acción explícita de parte del padre). En resumen, la cancelación es un medio de flujo de control de flujo de trabajo.
Abortar y terminar
Nuevamente, según la documentación de Msdn.
Anular es diferente de Terminar, ya que Abortar simplemente borra la instancia de flujo de trabajo en memoria y puede reiniciarse desde el último punto de persistencia, Terminar borra la instancia de flujo de trabajo en memoria e informa al servicio de persistencia que la instancia se ha borrado de la memoria. Para el SqlWorkflowPersistenceService, esto significa que toda la información de estado para esa instancia de flujo de trabajo se elimina de la base de datos al finalizar. No podrá volver a cargar la instancia de flujo de trabajo desde un punto de persistencia almacenado previamente.
Lo cual es bastante claro en sí mismo. Anular simplemente detiene la ejecución en memoria, mientras que Terminar detiene la ejecución en memoria y destruye cualquier estado persistente.