Delen via


Windows-werkstroomarchitectuur

Windows Workflow Foundation (WF) verhoogt het abstractieniveau voor het ontwikkelen van interactieve langlopende toepassingen. Werkeenheden worden ingekapseld als activiteiten. Activiteiten worden uitgevoerd in een omgeving die faciliteiten biedt voor stroombeheer, uitzonderingsafhandeling, foutdoorgifte, persistentie van statusgegevens, laden en lossen van actieve werkstromen uit geheugen, tracering en transactiestroom.

Activiteitsarchitectuur

Activiteiten worden ontwikkeld als CLR-typen die zijn afgeleid van Activity, CodeActivityof AsyncCodeActivity, of NativeActivityhun varianten die een waarde, Activity<TResult>, CodeActivity<TResult>, , AsyncCodeActivity<TResult>of NativeActivity<TResult>. Door activiteiten te ontwikkelen die zijn afgeleid van Activity , kan de gebruiker vooraf bestaande activiteiten samenstellen om snel werkeenheden te maken die worden uitgevoerd in de werkstroomomgeving. CodeActivityaan de andere kant kan uitvoeringslogica worden gemaakt in beheerde code met name CodeActivityContext voor toegang tot activiteitargumenten. AsyncCodeActivity is vergelijkbaar met, CodeActivity behalve dat deze kan worden gebruikt voor het implementeren van asynchrone taken. Door activiteiten te ontwikkelen die zijn afgeleid van NativeActivity , kunnen gebruikers toegang krijgen tot de runtime via de NativeActivityContext functionaliteit, zoals het plannen van kinderen, het maken van bladwijzers, het aanroepen van asynchroon werk, het registreren van transacties en meer.

Ontwerpactiviteiten die zijn afgeleid van Activity is declaratief en deze activiteiten kunnen worden geschreven in XAML. In het volgende voorbeeld wordt een aangeroepen Prompt activiteit gemaakt met behulp van andere activiteiten voor de hoofdtekst van de uitvoering.

<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>  

Activiteitscontext

Dit ActivityContext is de interface van de auteur van de activiteit voor de werkstroomruntime en biedt toegang tot de schat aan functies van de runtime. In het volgende voorbeeld wordt een activiteit gedefinieerd die gebruikmaakt van de uitvoeringscontext om een bladwijzer te maken (het mechanisme waarmee een activiteit een vervolgpunt kan registreren bij de uitvoering die kan worden hervat door een host die gegevens doorgeeft aan de activiteit).

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);
    }

Levenscyclus van activiteit

Een exemplaar van een activiteit begint in de Executing status. Tenzij er uitzonderingen worden aangetroffen, blijft deze status behouden totdat alle onderliggende activiteiten zijn uitgevoerd en alle andere in behandeling zijnde werkzaamheden (Bookmark bijvoorbeeld objecten) zijn voltooid, waarna deze overgaat naar de Closed status. De bovenliggende van een activiteitsexemplaren kan een kind vragen om te annuleren; als het kind kan worden geannuleerd, wordt deze voltooid in de Canceled status. Als er tijdens de uitvoering een uitzondering wordt gegenereerd, wordt de activiteit door de runtime in de Faulted status gebracht en wordt de uitzondering doorgegeven aan de bovenliggende keten van activiteiten. Hier volgen de drie voltooiingsstatussen van een activiteit:

  • Gesloten: De activiteit heeft het werk voltooid en afgesloten.

  • Geannuleerd: de activiteit heeft het werk correct verlaten en afgesloten. Werk wordt niet expliciet teruggedraaid wanneer deze status wordt ingevoerd.

  • Er is een fout opgetreden: de activiteit is mislukt en is afgesloten zonder het werk te voltooien.

Activiteiten blijven in de Executing status wanneer ze worden persistent of verwijderd.