Подтвердить что ты не робот

Рабочий процесс Windows 4: разница между WorkflowApplication Cancel, Terminate и Abort

Может ли кто-нибудь объяснить, какая разница между следующими методами WorkflowApplication:

Прервать Отмена Прервать

4b9b3361

Ответ 1

После дальнейшего изучения этой проблемы я хочу обобщить различия:

Завершить:

  • Завершенное событие приложения рабочего процесса будет запущено
  • Ошибка завершения CompletionState (WorkflowApplicationCompletedEventArgs)
  • Будет выгружено событие "Разгружено" приложения рабочего процесса.
  • рабочий процесс завершен
  • OnBodyCompleted на эту активность будет называться

Отмена

  • Завершенное событие приложения рабочего процесса будет запущено
  • Завершено (CompletionState) (WorkflowApplicationCompletedEventArgs) отменено
  • Будет выгружено событие "Разгружено" приложения рабочего процесса.
  • рабочий процесс завершен
  • OnBodyCompleted на эту активность будет называться

Прервать:

  • Будет выведено прерывание события приложения рабочего процесса
  • рабочий процесс не завершается

Необработанное исключение

  • запускает OnUnhandledException
  • в этом обработчике событий возвращаемое значение (типа UnhandledExceptionAction) определяет, что будет дальше:
  • UnhandledExceptionAction.Terminate завершает экземпляр рабочего процесса
  • UnhandledExceptionAction.Cancel отменит экземпляр рабочего процесса
  • UnhandledExceptionAction.Abort прервет экземпляр рабочего процесса
  • Каждый из них инициирует соответствующие события, описанные выше.

Обновление: Abort, похоже, не вызывает разгрузку экземпляра в хранилище сохраняемости SQL. Поэтому мне кажется, что лучше использовать "Отменить" или "Завершить", и если вам нужно выполнить какое-либо действие, основанное на статусе завершения, вы можете проверить CompletionState в событии Complete.

Ответ 2

Во-первых, шляпы у Steffen Opel (и его комментарии ниже). Мне не удалось поймать, что мой оригинальный пост связал документация, которая была WF 3.5. Немного больше копал.

Для потомков я оставил свой предыдущий ответ ниже, обозначенный как WF3.5. Пожалуйста, смотрите WF4.0 несколько примечаний относительно отмены, отмены и завершения в WF4.0.


WF4.0

К сожалению, есть небольшая явная документация, в которой обсуждаются различия в Cancel, Abort и Terminate в WF4.0. Однако из member метод ,

  • On Abort, a) действие немедленно прекращается, b) вызывается прерывание обработчика и c) завершенный обработчик не вызывается.
  • В режиме "Отмена" , а) для операции задан льготный период, чтобы прекратить изящество, после чего генерируется исключение TimeoutException, b) Вызывается обработчик завершенного кода.
  • В Terminate, a) для операции предоставляется льготный период для прекращения изящества, после которого генерируется исключение TimeoutException, b) Вызывается завершенный обработчик.

Различия между Abort и Cancel/Terminate довольно впечатляют. Просто вызовите Abort, чтобы убить Workflow прямо. Разница между Cancel и Terminate более тонкая. Отмена не требует какой-либо причины (это метод без пробелов), тогда как для Terminate требуется причина (в формате строки или исключения).

Во всех случаях рабочая среда Workflow не будет выполнять каких-либо неявных действий от вашего имени (т.е. Workflow не будет автоматически самоуничтожить a la WF3.5 Terminate). Однако с очень настраиваемой обработкой исключений \event, отображаемой средой выполнения, любые такие функции могут быть реализованы с относительной легкостью.


WF3.5

Отмена

Согласно Msdn документация

Активность помещается в состояние "Отмена" родительским действием явно или потому, что во время выполнения этого действия было выбрано исключение.

В то время как "Отмена" может использоваться для остановки всего рабочего процесса (т.е. вызванного в корневой активности), он обычно используется для остановки дискретных частей рабочего процесса (т.е. либо для восстановления ошибок, либо для явного действия части родителя). Короче говоря, Отмена - это средство управления потоком Workflow.

Отменить и завершить

Опять же, согласно Документация Msdn

Abort отличается от Terminate тем, что, в то время как Abort просто очищает экземпляр рабочего процесса в памяти и может быть перезапущен из последней точки сохранения, Terminate очищает экземпляр рабочего процесса in-memory и сообщает службе сохранения, что экземпляр был очищен от Память. Для SqlWorkflowPersistenceService это означает, что вся информация о состоянии для этого экземпляра рабочего процесса удаляется из базы данных после завершения. Вы не сможете перезагрузить экземпляр рабочего процесса из ранее сохраненной точки сохранения.

Это довольно ясно. Abort просто прекращает выполнение в памяти, тогда как Terminate останавливает выполнение в памяти и уничтожает любое сохраненное состояние.