2010-07-19 14 views

risposta

30

Dopo aver esaminato ulteriormente la questione, voglio riassumere le differenze:

Terminate:

  • verrà attivato l'evento completa dell'applicazione del flusso di lavoro
  • il CompletionState (WorkflowApplicationCompletedEventArgs) è guasta
  • l'evento Unloaded dell'applicazione del flusso di lavoro verrà attivato
  • il flusso di lavoro completa
  • OnBodyCompleted sull'attività saranno chiamati

Annulla:

  • verrà attivato l'evento completa dell'applicazione del flusso di lavoro
  • il CompletionState (WorkflowApplicationCompletedEventArgs) viene annullato
  • l'evento a vuoto l'applicazione del flusso di lavoro verrà attivata
  • il flusso di lavoro completa
  • OnBodyCompleted sull'attività saranno chiamati

Abort:

  • verrà attivato l'evento Interrotto dell'applicazione flusso di lavoro
  • il flusso di lavoro non viene completato

un'eccezione non gestita

  • innesca OnUnhandledException
  • in questo eventhandler il valore di ritorno (di tipo UnhandledExceptionAction) determina cosa accadrà dopo:
  • UnhandledExceptionAction.Terminate terminerà del flusso di lavoro
  • UnhandledExceptionAction.Cancel annullerà del flusso di lavoro
  • UnhandledExceptionAction .Abort sarà interrompere il flusso di lavoro
  • Ogni attiverà gli eventi corrispondenti illustrati sopra

Aggiornamento: l'interruzione non sembra attivare lo scaricamento dell'istanza nell'archivio di persistenza SQL. Quindi, mi sembra, è meglio usare Annulla o Termina e se si deve eseguire un'azione in base allo stato di completamento, è possibile controllare CompletionState nell'evento Completo.

15

In primo luogo, cappello a Steffen Opel (e i suoi commenti sotto). Non sono riuscito a rilevare che il mio post originale linkeddocumentation era WF 3.5 specifico. Ha scavato un po 'di più.

Per i posteri, ho lasciato la mia risposta precedente di seguito, etichettata come WF3.5. Vedere WF4.0 per alcune note relative a Annullamento, Interruzione e Termine in WF4.0.


WF4.0

Purtroppo, c'è poco differenze di documentazione discutere espliciti a Annulla, Abort, e terminano in WF4.0. Tuttavia, da membermethoddocumentation,

  1. Su Abort, a) l'attività si interrompe immediatamente, b) gestore abortito è invocato, e c) del gestore Completato è non invocato.
  2. In Annulla, a) all'attività viene assegnato un periodo di prova per interrompere con garbo dopo il quale viene generata un'eccezione TimeoutExce, b) Viene richiamato il gestore completato.
  3. On Termina, a) viene assegnato un periodo di prova per interrompere con garbo dopo il quale viene generata un'eccezione TimeoutExce, b) viene richiamato il gestore completato.

Le differenze tra Annullare e Annullare/Terminare sono abbastanza evidenti. Basta chiamare Abort per uccidere un workflow a titolo definitivo. La differenza tra Annulla e Termina è più sfumata. Annulla non richiede alcun tipo di motivo (è un metodo senza parametri nullo), mentre Terminate richiede un motivo () (in formato stringa o Eccezione).

In tutti i casi, il runtime del flusso di lavoro sarà non eseguire qualsiasi azione implicita per conto dell'utente (ad esempio, i flussi di lavoro non si autodistruggono automaticamente a la WF3.5 Terminare). Tuttavia, con la gestione di eccezioni \ event altamente personalizzabile esposta dal runtime, tali funzionalità possono essere implementate con relativa facilità.


WF3.5

Annullamento

Secondo Msdndocumentation

Un'attività viene messo in stato di Annullamento da un'attività genitore in modo esplicito, o perché un è stata lanciata un'eccezione durante l'esecuzione di tale attività.

Mentre Annullamento può essere utilizzato per arrestare un intero flusso di lavoro (cioè invocato sulla radice Attività), viene in genere utilizzato per arrestare porzioni discrete di un flusso di lavoro (cioè o come errore di recupero o un'azione esplicita da parte del genitore). In breve, la cancellazione è un mezzo di controllo del flusso di lavoro.

interruzione e Terminate

Sempre secondo Msdn documentation

interruzione è diverso da terminare in che mentre Interruzione cancella semplicemente l'in-memory workflow esempio e può essere riavviata dall'ultimo punto persistenza , Termina cancella l'istanza del flusso di lavoro in memoria e informa il servizio di persistenza che l'istanza è stata cancellata dalla memoria. Per SqlWorkflowPersistenceService, ciò significa che tutte le informazioni di stato per quell'istanza del flusso di lavoro vengono eliminate dal database al termine. Non sarà possibile ricaricare l'istanza del flusso di lavoro da un punto di persistenza memorizzato in precedenza.

Che è abbastanza chiaro in sé. L'interruzione interrompe semplicemente l'esecuzione in memoria mentre Termina interrompe l'esecuzione in memoria e distrugge qualsiasi stato persistente.

+2

Hmmh, i tuoi collegamenti MSDN puntano tutti alla documentazione WF 3.5. Mentre ci sono molte somiglianze concettuali, naturalmente, l'architettura [è stata modificata abbastanza] (http://msdn.microsoft.com/en-us/library/dd489410.aspx) per rendere le risposte WF 3.5 alle domande di WF 4 confondendo al meglio , Temo - vedere ad esempio la sezione * Ciclo di vita delle attività * alla fine di [Architettura del flusso di lavoro di Windows] (http://msdn.microsoft.com/en-us/library/dd489413.aspx) in confronto a [Understanding the Activity State Model] (http://msdn.microsoft.com/en-us/library/bb628512%28VS.90%29.aspx) come collegato dalla risposta. –

+0

grazie, buona cattura! spero che la mia risposta aggiornata sia un po 'più chiara e accurata :) –

Problemi correlati