Freigeben über


Ausführen von Workflows

Workflowinstanzen können auf zwei Arten gestartet werden: Durch Workflowtypen oder durch XAML-basierte Workflowmarkups.

Rufen Sie zum Starten einer Workflowinstanz mithilfe eines Workflowtyps die CreateWorkflow-Methode auf, geben Sie den System.Type des Workflows ein, und rufen Sie dann Start auf.

Dim workflowInstance As WorkflowInstance
workflowInstance = workflowRuntime.CreateWorkflow(GetType(Workflow1))
workflowInstance.Start()
WorkflowInstance instance = workflowRuntime.CreateWorkflow
    (typeof(WorkflowApplication.Workflow1));
instance.Start();

Rufen Sie zum Starten einer Workflowinstanz mithilfe eines Workflowmarkups die CreateWorkflow-Methode auf, geben Sie den XmlReader ein, der die Workflowdefinition entweder in einer Datei oder in einem Stream enthält, und rufen Sie dann Start auf.

Dim workflowInstance As WorkflowInstance
workflowInstance = workflowRuntime.CreateWorkflow(workflowDefinitionReader)
workflowInstance.Start()
WorkflowInstance instance = workflowRuntime.CreateWorkflow(workflowDefinitionReader);
instance.Start();

Tipp

Bei Verwendung der Workflowmarkupdatei mit einer Codetrennungsdatei muss der Workflowtyp in CreateWorkflow und nicht in die Workflowmarkupdatei eingegeben werden.

Standardmäßig werden Workflows asynchron vom Windows Workflow-Laufzeitmodul gestartet. Stellen Sie sicher, dass die Hostanwendung nicht geschlossen wird, bevor die Ausführung des Workflows abgeschlossen ist, indem Sie synchronisierende Threadingobjekte verwenden, die vom .NET Framework bereitgestellt werden, wie z. B. das AutoResetEvent-Objekt. Im folgenden Codebeispiel werden das Erstellen und das Starten der Workflowlaufzeit, das Starten einer Workflowinstanz und das Beenden mithilfe eines AutoResetEvent erklärt, wenn vom WorkflowRuntime-Objekt das WorkflowCompleted-Ereignis ausgelöst wird.

Class Program

    Shared WaitHandle As New AutoResetEvent(False)

    Shared Sub Main()
        Using workflowRuntime As New WorkflowRuntime()
            AddHandler workflowRuntime.WorkflowCompleted, AddressOf OnWorkflowCompleted

            Dim workflowInstance As WorkflowInstance
            workflowInstance = workflowRuntime.CreateWorkflow(GetType(Workflow1))
            workflowInstance.Start()
            WaitHandle.WaitOne()
        End Using
    End Sub

    Shared Sub OnWorkflowCompleted(ByVal sender As Object, ByVal e As WorkflowCompletedEventArgs)
        WaitHandle.Set()
    End Sub
End Class
static void Main(string[] args)
{
    using (WorkflowRuntime workflowRuntime = new WorkflowRuntime())
    {
        AutoResetEvent waitHandle = new AutoResetEvent(false);

        workflowRuntime.WorkflowCompleted += delegate(object sender,
            WorkflowCompletedEventArgs e)
        { 
            waitHandle.Set(); 
        };
        
        WorkflowInstance instance = workflowRuntime.CreateWorkflow
            (typeof(WorkflowApplication.Workflow1));

        instance.Start();

        waitHandle.WaitOne();
    }
}

Für die Windows Workflow Foundation bestehen keine Einschränkungen für die Ausführungsumgebung der Hostanwendung. Einige Hostanwendungsumgebungen erfordern beispielsweise, dass mehrere Prozesse in mehreren Anwendungsdomänen ausgeführt werden, von denen jeder unabhängig von den anderen Ausführungsprozessen über ein eigenes Threadingmodell verfügt. Auf diese Art bleibt Windows Workflow Foundation tragbar und erweiterbar, wenn sich zugrunde liegende Hostingarchitekturen ändern.

Tipp

Von Windows Workflow Foundation wird der .NET-Threadpool verwendet. Falls es sich bei der Hostanwendung um eine Multithreadanwendung handelt und der .NET-Threadpool häufig verwendet wird, wird der .NET-Threadpool möglicherweise blockiert. Dadurch könnten Timeouts verursacht werden, wenn von einem Persistenzdienst versucht wird, eine Persistenztransaktion abzuschließen, da der .NET-Threadpool auch von Transaction-Objekten verwendet wird.

Siehe auch

Konzepte

Erstellen von WorkflowRuntime
Verarbeiten von WorkflowRuntime-Ereignissen

Copyright © 2007 Microsoft Corporation. Alle Rechte vorbehalten.