Рабочий процесс Windows 4: разница между отменой, завершением и прерыванием WorkflowApplication - PullRequest
22 голосов
/ 19 июля 2010

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

Прервать Отмена Завершить

Ответы [ 2 ]

31 голосов
/ 24 сентября 2010

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

Завершить:

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

Отмена:

  • Будет завершено событие Completed приложения рабочего процесса
  • Отменено CompletionState (WorkflowApplicationCompletedEventArgs)
  • Событие Unloaded приложения рабочего процессабудет запущено
  • рабочий процесс завершится
  • OnBodyCompleted для операции будет называться

Прервать:

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

Необработанный exception

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

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

15 голосов
/ 19 июля 2010

Сначала снимаю шляпу перед Штеффен Опелем (и его комментарии ниже). Я не смог уловить, что мой исходный пост связан документация , который был WF 3.5 специфический. Еще немного покопался.

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


WF4.0

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

  1. При прерывании: а) действие немедленно останавливается, б) отмененный обработчик вызывается и в) завершенный обработчик не вызывается.
  2. При отмене, а) активности дается льготный период, чтобы изящно остановиться, после чего генерируется исключение TimeoutException, б) вызывается обработчик завершенных действий.
  3. При завершении, а) активности дается льготный период для постепенного прекращения, после которого выдается исключение TimeoutException, б) вызывается завершенный обработчик.

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

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


WF3.5

Отмена

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

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

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

Прервать и прекратить

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

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

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

...