Condividi tramite


Architettura del flusso di lavoro di Windows

Windows Workflow Foundation (WF) genera il livello di astrazione per lo sviluppo di applicazioni interattive con esecuzione prolungata. Le unità di lavoro vengono incapsulate come attività. Le attività vengono eseguite in un ambiente che fornisce funzionalità per il controllo del flusso, gestione delle eccezioni, propagazione degli errori, persistenza dei dati relativi allo stato, caricamento e scaricamento di flussi di lavoro in corso dalla memoria, rilevamento e flusso della transazione.

Architettura dell'attività

Le attività vengono sviluppate come tipi CLR che derivano dall'oggetto Activity, CodeActivity, AsyncCodeActivity o NativeActivity oppure dalle relative varianti che restituiscono un valore, Activity<TResult>, CodeActivity<TResult>, AsyncCodeActivity<TResult> o NativeActivity<TResult>. Lo sviluppo di attività che derivano dall'oggetto Activity consente all'utente di assemblare attività preesistenti per creare rapidamente unità di lavoro che vengono eseguite nell'ambiente del flusso di lavoro. L'oggetto CodeActivity, d'altra parte, consente la creazione della logica di esecuzione nel codice gestito usando l'oggetto CodeActivityContext principalmente per accedere agli argomenti delle attività. L'oggetto AsyncCodeActivity è simile a CodeActivity con la differenza che può essere usato per implementare attività asincrone. Lo sviluppo di attività che derivano dall'oggetto NativeActivity consente agli utenti di accedere al runtime tramite l'oggetto NativeActivityContext per funzionalità quali la pianificazione di elementi figlio, la creazione di segnalibri, il richiamo di lavori asincroni, la registrazione di transazioni e così via.

La creazione di attività che derivano dall'oggetto Activity è dichiarativa e questa attività possono essere create in XAML. Nell'esempio seguente viene creata un'attività denominata Prompt usando altre attività per il corpo dell'esecuzione.

<Activity x:Class='Prompt'  
  xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'  
    xmlns:z='http://schemas.microsoft.com/netfx/2008/xaml/schema'  
xmlns:my='clr-namespace:XAMLActivityDefinition;assembly=XAMLActivityDefinition'  
xmlns:s="clr-namespace:System;assembly=mscorlib"  
xmlns="http://schemas.microsoft.com/2009/workflow">  
<z:SchemaType.Members>  
  <z:SchemaType.SchemaProperty Name='Text' Type='InArgument(s:String)' />  
  <z:SchemaType.SchemaProperty Name='Response' Type='OutArgument(s:String)' />  
</z:SchemaType.Members>  
  <Sequence>  
    <my:WriteLine Text='[Text]' />  
    <my:ReadLine BookmarkName='r1' Result='[Response]' />  
  </Sequence>  
</Activity>  

Contesto dell'attività

L'oggetto ActivityContext rappresenta l'interfaccia tra l'autore di attività e l'esecuzione del flusso di lavoro e fornisce l'accesso alle numerose funzionalità di esecuzione. Nell'esempio seguente viene definita un'attività che usa il contesto di esecuzione per creare un segnalibro (meccanismo che consente a un'attività di registrare un punto di continuazione nella relativa esecuzione che può essere ripresa da un host che passa dati all'attività).

public sealed class ReadLine : NativeActivity<string>
{
    [RequiredArgument]
    public InArgument<string> BookmarkName { get; set; }

    protected override void Execute(NativeActivityContext context)
    {
        // Create a Bookmark and wait for it to be resumed.
        context.CreateBookmark(BookmarkName.Get(context),
            new BookmarkCallback(OnResumeBookmark));
    }

    // NativeActivity derived activities that do asynchronous operations by calling
    // one of the CreateBookmark overloads defined on System.Activities.NativeActivityContext
    // must override the CanInduceIdle property and return true.
    protected override bool CanInduceIdle
    {
        get { return true; }
    }

    public void OnResumeBookmark(NativeActivityContext context, Bookmark bookmark, object obj)
    {
        // When the Bookmark is resumed, assign its value to
        // the Result argument.
        Result.Set(context, (string)obj);
    }

Ciclo di vita dell'attività

Un'istanza di un'attività viene avviata nello stato Executing. A meno che non si verifichino eccezioni, rimane in questo stato finché non vengono completati l'esecuzione di tutte le attività figlio e qualsiasi altro lavoro in sospeso (ad esempio gli oggetti Bookmark); a questo punto passa allo stato Closed. L'elemento padre di un istanza dell'attività può richiedere l'annullamento di un elemento figlio. Se quest'ultimo può essere annullato, viene completato nello stato Canceled. Se durante l'esecuzione viene generata un'eccezione, il runtime inserisce l'attività nello stato Faulted e propaga l'eccezione fino alla catena di attività padre. Di seguito sono riportati i tre stati di completamento di un'attività:

  • Closed: l'attività ha completato il proprio lavoro ed è stata chiusa.

  • Canceled: l'attività ha interrotto normalmente il proprio lavoro ed è stata chiusa. Quando viene immesso questo stato, il lavoro non viene sottoposto a rollback in modo esplicito.

  • Faulted: l'attività ha rilevato un errore ed è stata chiusa prima del completamento del lavoro.

Le attività rimangono nello stato Executing quando vengono rese persistenti o scaricate.