Architektur von Windows-Workflows

Windows Workflow Foundation (WF) hebt die Abstraktionsebene für die Entwicklung interaktiver, zeitintensiver Anwendungen an. Arbeitseinheiten werden als Aktivitäten gekapselt. Aktivitäten werden in einer Umgebung ausgeführt, die Funktionen für Flusssteuerung, Ausnahmebehandlung, Fehlerweitergabe, Persistenz von Zustandsdaten, Laden und Entladen von aktuell verarbeiteten Workflows aus dem Arbeitsspeicher, Nachverfolgung und Transaktionsfluss bietet.

Aktivitätsarchitektur

Aktivitäten werden als CLR-Typen entwickelt, die von Activity, CodeActivity, AsyncCodeActivity oder NativeActivity abgeleitet werden oder aber von den entsprechenden Varianten, die einen Wert zurückgeben: Activity<TResult>, CodeActivity<TResult>, AsyncCodeActivity<TResult> oder NativeActivity<TResult>. Das Entwickeln von Aktivitäten, die von Activity abgeleitet werden, ermöglicht dem Benutzer, bereits vorhandene Aktivitäten zusammenzustellen, um so schnell Arbeitseinheiten zu erstellen, die in der Workflowumgebung ausgeführt werden. CodeActivity hingegen ermöglicht das Schreiben von Ausführungslogik in verwaltetem Code mit CodeActivityContext, hauptsächlich für den Zugriff auf Aktivitätsargumente. AsyncCodeActivity ist mit CodeActivity vergleichbar, außer dass sie verwendet werden kann, um asynchrone Aufgaben zu implementieren. Das Entwickeln von Aktivitäten, die von NativeActivity abgeleitet werden, ermöglicht Benutzern, über den NativeActivityContext auf die Laufzeit zuzugreifen, um Funktionen wie die Planung untergeordneter Elemente, das Erstellen von Lesezeichen, das Aufrufen asynchroner Arbeit, das Registrieren von Transaktionen und viele mehr zu nutzen.

Das Entwickeln von Aktivitäten, die von Activity abgeleitet werden, ist deklarativ. Diese Aktivitäten können in XAML erstellt werden. Im folgenden Beispiel wird eine Aktivität mit dem Namen Prompt erstellt, wobei andere Aktivitäten für den Ausführungstext verwendet werden.

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

Aktivitätskontext

Das ActivityContext-Objekt ist für den Ersteller der Aktivität die Schnittstelle zur Workflowlaufzeit und bietet Zugriff auf die zahlreichen Funktionen der Laufzeit. Im folgenden Beispiel wird eine Aktivität definiert, die mit dem Ausführungskontext ein Lesezeichen erstellt (der Mechanismus, der es einer Aktivität ermöglicht, in der Ausführung einen Fortsetzungspunkt zu registrieren, sodass die Fortsetzung erfolgt, wenn ein Host Daten an die Aktivität übergibt).

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

Aktivitätslebenszyklus

Eine Instanz einer Aktivität startet mit dem Executing-Zustand. Wenn keine Ausnahmen auftreten, verbleibt die Instanz in diesem Zustand, bis die Ausführung aller untergeordneten Aktivitäten beendet wurde und alle weiteren ausstehenden Arbeitsvorgänge (z. B. Bookmark-Objekte) abgeschlossen sind. An diesem Punkt geht die Instanz in den Closed-Zustand über. Das übergeordnete Element einer Aktivitätsinstanz kann den Abbruch eines untergeordneten Elements anfordern. Wenn das untergeordnete Element abgebrochen werden kann, wird es mit dem Canceled-Zustand abgeschlossen. Wenn während der Ausführung eine Ausnahme ausgelöst wird, versetzt die Laufzeit die Aktivität in den Faulted-Zustand und gibt die Ausnahme an die Kette übergeordneter Aktivitäten weiter. Dies sind die drei Abschlusszustände einer Aktivität:

  • Closed: Die Aktivität hat alle Arbeitsvorgänge abgeschlossen und wurde beendet.

  • Canceled: Die Aktivität hat die Arbeit ordnungsgemäß abgebrochen und wurde beendet. Für die Arbeit wird kein expliziter Rollback ausgeführt, wenn dieser Zustand eintritt.

  • Faulted: Es ist ein Fehler aufgetreten, und die Aktivität wurde ohne Abschließen der Arbeit beendet.

Beim dauerhaften Speichern und Entladen verbleiben Aktivitäten im Executing-Zustand.