Vorgehensweise: Erstellen und Ausführen eines Workflows mit langer Laufzeit
Dieses Thema gilt für Windows Workflow Foundation 4.
Eine der zentralen Funktionen von Windows Workflow Foundation (WF) besteht darin, dass Laufzeit Workflows im Leerlauf in einer Datenbank speichern und entladen kann. In diesem Thema wird gezeigt, wie eine lokale Datenbank für die Workflowpersistenz erstellt und die Persistenz in einer Workflowanwendung aktiviert wird.
Hinweis: |
---|
Ein Thema im Lernprogramm "Erste Schritte" hängt jeweils von den vorherigen Themen ab. Um dieses Thema verwenden zu können, müssen Sie zuerst Vorgehensweise: Erstellen einer Aktivität, Vorgehensweise: Erstellen eines Workflows und Vorgehensweise: Ausführen eines Workflows durcharbeiten und abschließen. |
So erstellen Sie die Persistenzdatenbank
Öffnen Sie SQL Server Management Studio, und stellen Sie eine Verbindung mit dem lokalen Server her. Klicken Sie mit der rechten Maustaste auf den Knoten Datenbanken auf dem lokalen Server, und wählen Sie Neue Datenbank aus. Benennen Sie die neue Persistenzdatenbank um, nehmen Sie alle anderen Werte an, und wählen Sie OK aus.
Hinweis: Stellen Sie sicher, dass Sie die Berechtigung Datenbank erstellen für den lokalen Server haben, bevor Sie versuchen, eine neue Datenbank zu erstellen. Klicken Sie mit der rechten Maustaste auf die neue Persistenzdatenbank, und wählen Sie Neue Abfrage aus. Öffnen Sie den folgenden Ordner: C:\Windows\Microsoft.NET\Framework\<aktuelle Version>\sql\en. Ziehen Sie die folgenden Dateien in das Abfragefenster, und führen Sie sie in der folgenden Reihenfolge aus:
SqlWorkflowInstanceStoreSchema.sql
SqlWorkflowInstanceStoreLogic.sql
So aktivieren Sie die Persistenz in einer Workflowanwendung
Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf WorkflowConsoleApplication1, und wählen Sie dann Verweis hinzufügen aus.
Wählen Sie auf der Registerkarte .NET die Option System.Activities.DurableInstancing und System.Runtime.DurableInstancing aus, und klicken Sie auf OK.
Öffnen Sie Program.cs (Module1.vb für Visual Basic) im Projekt WorkflowConsoleApplication1. Deklarieren Sie in der
Program
-Klasse (Module1
für Visual Basic) eine Zeichenfolgenkonstante, die eine Verbindungszeichenfolge zur Persistenzdatenbank definiert, die im ersten Vorgang erstellt wurde.Const connectionString As String = "Server=.\\SQLEXPRESS;Initial Catalog=Persistence;Integrated Security=SSPI"
const string connectionString = "Server=.\\SQLEXPRESS;Initial Catalog=Persistence;Integrated Security=SSPI";
Hinweis: Abhängig von der SQL Server-Version kann der Servername der Verbindungszeichenfolge abweichen. Fügen Sie als Nächstes eine using- oder Imports-Anweisung für
System.Activities.DurableInstancing
in der Datei Program.cs oder der Datei Module1.vb hinzu.Imports System.Activities.DurableInstancing
using System.Activities.DurableInstancing;
Erstellen Sie in der
Main
-Methode im Anschluss an den Code, der die WorkflowApplication erstellt, einen SqlWorkflowInstanceStore, und weisen Sie diesem dem InstanceStore der WorkflowApplication zu.Dim inputs As New Dictionary(Of String, Object) inputs.Add("MaxNumber", 100) Dim wfApp As New WorkflowApplication(New Workflow1(), inputs) Dim store As New SqlWorkflowInstanceStore(connectionString) wfApp.InstanceStore = store
WorkflowApplication wfApp = new WorkflowApplication(new Workflow1(), inputs); SqlWorkflowInstanceStore store = new SqlWorkflowInstanceStore(connectionString); wfApp.InstanceStore = store;
Legen Sie danach fest, dass der Workflow gespeichert werden soll, wenn er in den Leerlauf wechselt. Ersetzen Sie hierzu den Delegaten für das
Idle
-Ereignis, das im vorherigen Thema hinzugefügt wurde, durch den folgenden Code, in dem PersistableIdle behandelt wird.' Replace the Idle handler with a PersistableIdle handler. 'wfApp.Idle = _ ' Sub(e As WorkflowApplicationIdleEventArgs) ' idleEvent.Set() ' End Sub wfApp.PersistableIdle = _ Function(e As WorkflowApplicationIdleEventArgs) idleEvent.Set() Return PersistableIdleAction.Persist End Function
// Replace the Idle handler with a PersistableIdle handler. //wfApp.Idle = delegate(WorkflowApplicationIdleEventArgs e) //{ // idleEvent.Set(); //}; wfApp.PersistableIdle = delegate(WorkflowApplicationIdleEventArgs e) { idleEvent.Set(); return PersistableIdleAction.Persist; };
Hinweis: Die PersistableIdleAction-Enumeration verfügt über drei Werte: None, Persist und Unload. Persist bewirkt, dass der Workflow beibehalten wird, jedoch nicht, dass er entladen wird. Unload bewirkt, dass der Workflow gespeichert und entladen wird. Nachdem die Instanz entladen wurde, wird die WorkflowApplication freigegeben. Für die nächste Interaktion mit dem entladenen Workflow ist ein neues WorkflowApplication-Objekt erforderlich. In diesem Thema wird Persist
dazu verwendet, den Workflow im Arbeitsspeicher beizubehalten, und die WorkflowApplication wird nicht freigegeben. Ein Beispiel für die Verwendung einer WorkflowApplication mit dem Unload-Enumerationswert finden Sie im Beispiel Beibehalten einer Workflowanwendung.Fügen Sie am Ende der
Main
-Methode die folgenden Codezeilen hinzu. WorkflowApplication entlädt automatisch Workflowinstanz aus dem Arbeitsspeicher, nachdem das Spiel abgeschlossen wurde, und entfernt den Persistenzdatensatz aus der Datenbank.Console.WriteLine("Press any key to continue . . .") Console.ReadKey()
Console.WriteLine("Press any key to continue . . ."); Console.ReadKey();
Hinweis: Wenn der Workflow abgeschlossen wird, wird der Persistenzdatensatz für den Workflow entfernt. In diesem Beispiel würde die Hostanwendung ohne den Console.ReadKey sofort nach dem Abschließen des Workflows beendet. Da die Persistenzbereinigung von einem Hintergrundthread ausgeführt wird, kann der Schritt nicht abgeschlossen werden, wenn der Host beendet wird, bevor die Bereinigung abgeschlossen ist. Eine andere Möglichkeit zu verhindern, dass der Host beendet wird, bevor der Persistenzvorgang abgeschlossen ist, besteht in einer Blockierung des Hosts, bis das Unloaded-Ereignis auftritt, nachdem der Workflow abgeschlossen wurde. Nachdem ein Workflow abgeschlossen wurde, wird er erst entladen, wenn die Aufgaben im Hintergrund, z. B. das Entfernen des abgeschlossenen Workflows aus der Persistenz, abgeschlossen sind. Wenn Sie die Speicherung testen möchten, drücken Sie F5, um die Anwendung zu starten, und wechseln Sie zurück zu SQL Server Management Studio. Erweitern Sie den Datenbankknoten Persistence (oder den Datenbankknoten Master, wenn Sie die Persistenztabellen in der Masterdatenbank erstellt haben) und den Knoten Tables innerhalb der Persistenzdatenbank. Klicken Sie mit der rechten Maustaste auf die Tabelle InstancesTable, und wählen Sie Oberste 1000 Zeilen auswählen aus. Es wird im Regelfall eine Zeile mit der Workflow-ID des gespeicherten Workflows angezeigt.
Spielen Sie als Nächstes das Spiel durch, um den Workflow abzuschließen. Kehren Sie zu SQL Server Management Studio zurück, sobald das Spiel beendet wurde, und führen Sie die Abfrage erneut aus. Beachten Sie, dass kein Persistenzdatensatz zurückgegeben wird.
Sie haben das Lernprogramm "Erste Schritte" abgeschlossen.