Vorgehensweise: Paralleles Hosten mehrerer WorkflowversionenHow to: Host Multiple Versions of a Workflow Side-by-Side

WorkflowIdentity bietet Entwicklern von Workflowanwendungen die Möglichkeit, einer Worfklowdefinition einen Namen und eine Version zuzuordnen und diese Informationen mit einer persistenten Workflowinstanz zu verknüpfen.WorkflowIdentity provides a way for workflow application developers to associate a name and a version with a workflow definition, and for this information to be associated with a persisted workflow instance. Entwickler von Workflowanwendungen können diese Identitätsinformationen verwenden, um Szenarien wie die parallele Ausführung mehrerer Versionen einer Workflowdefinition umzusetzen. Darüber hinaus bilden sie die Grundlage für andere Funktionen wie dynamische Updates.This identity information can be used by workflow application developers to enable scenarios such as side-by-side execution of multiple versions of a workflow definition, and provides the cornerstone for other functionality such as dynamic update. In diesem Schritt des Lernprogramms wird veranschaulicht, wie mit WorkflowIdentity mehrere Versionen eines Workflows gleichzeitig gehostet werden.This step in the tutorial demonstrates how to use WorkflowIdentity to host multiple versions of a workflow at the same time.

Hinweis

Um den download einer vervollständigten Version oder eine Videodemonstration des Lernprogramms anzuzeigen, finden Sie unter Windows Workflow Foundation (WF45) Getting Started Tutorial.To download a completed version or view a video walkthrough of the tutorial, see Windows Workflow Foundation (WF45) - Getting Started Tutorial.

In diesem ThemaIn this topic

In diesem Schritt des Lernprogramms werden die WriteLine-Aktivitäten im Workflow geändert, um zusätzliche Informationen bereitzustellen. Außerdem wird eine neue WriteLine-Aktivität hinzugefügt.In this step of the tutorial, the WriteLine activities in the workflow are modified to provide additional information, and a new WriteLine activity is added. Eine Kopie der ursprünglichen Workflowassembly wird gespeichert, und die Hostanwendung wird aktualisiert, sodass der ursprüngliche und der aktualisierte Workflow gleichzeitig ausgeführt werden können.A copy of the original workflow assembly is stored, and the host application is updated so that it can run both the original and the updated workflows at the same time.

Hinweis

Bevor Sie die Schritte in diesem Thema ausführen, führen Sie die Anwendung aus, starten mehrere Workflows jedes Typs und geben einen oder zwei Schätzwerte für jeden Typ an.Before following the steps in this topic, run the application, start several workflows of each type, and making one or two guesses for each one. Diese persistenten Workflows werden in diesem Schritt und den folgenden Schritt aus, verwendet Vorgehensweise: Aktualisieren der Definition einer ausgeführten Workflowinstanz.These persisted workflows are used in this step and the following step, How to: Update the Definition of a Running Workflow Instance.

Hinweis

Jeder Schritt im Lernprogramm "Erste Schritte" hängt jeweils von den vorherigen Schritten ab.Each step in the Getting Started tutorial depends on the previous steps. Wenn Sie nicht die vorherigen Schritte abgeschlossen haben, können Sie eine abgeschlossene Version des Lernprogramms von herunterladen Windows Workflow Foundation (WF45) Getting Started Tutorial.If you did not complete the previous steps you can download a completed version of the tutorial from Windows Workflow Foundation (WF45) - Getting Started Tutorial.

Um eine Kopie des NumberGuessWorkflowActivities-Projekts erstellenTo make a copy of the NumberGuessWorkflowActivities project

  1. Öffnen Sie die WF45GettingStartedTutorial -Lösung in Visual Studio 2012, wenn er nicht geöffnet ist.Open the WF45GettingStartedTutorial solution in Visual Studio 2012 if it is not open.

  2. Drücken Sie STRG+UMSCHALT+B, um die Projektmappe zu erstellen.Press CTRL+SHIFT+B to build the solution.

  3. Schließen der WF45GettingStartedTutorial Lösung.Close the WF45GettingStartedTutorial solution.

  4. Öffnen Sie Windows-Explorer, und navigieren Sie zu dem Ordner, in dem sich die Projektmappendatei und die Projektordner des Lernprogramms befinden.Open Windows Explorer and navigate to the folder where the tutorial solution file and the project folders are located.

  5. Erstellen Sie einen neuen Ordner namens PreviousVersions im gleichen Ordner wie NumberGuessWorkflowHost und NumberGuessWorkflowActivities.Create a new folder named PreviousVersions in the same folder as NumberGuessWorkflowHost and NumberGuessWorkflowActivities. In diesem Ordner werden die Assemblys gespeichert, die die verschiedenen Versionen der in den folgenden Lernprogrammschritten verwendeten Workflows enthalten.This folder is used to contain the assemblies that contain the different versions of the workflows used in the subsequent tutorial steps.

  6. Navigieren Sie zu der NumberGuessWorkflowActivities\bin\debug Ordner (oder "bin\Release" je nach den projekteinstellungen).Navigate to the NumberGuessWorkflowActivities\bin\debug folder (or bin\release depending on your project settings). Kopie NumberGuessWorkflowActivities.dll , und fügen Sie ihn in das PreviousVersions Ordner.Copy NumberGuessWorkflowActivities.dll and paste it into the PreviousVersions folder.

  7. Benennen Sie NumberGuessWorkflowActivities.dll in die PreviousVersions Ordner NumberGuessWorkflowActivities_v1.dll.Rename NumberGuessWorkflowActivities.dll in the PreviousVersions folder to NumberGuessWorkflowActivities_v1.dll.

    Hinweis

    Die Schritte in diesem Thema zeigen eine Möglichkeit zur Verwaltung der Assemblys, in denen mehrere Versionen der Workflows enthalten sind.The steps in this topic demonstrate one way to manage the assemblies used to contain multiple versions of the workflows. Andere Methoden, wie starke Namen für die Assemblys und das Registrieren der Assemblys im globalen Assemblycache, können ebenfalls verwendet werden.Other methods such as strong naming the assemblies and registering them in the global assembly cache could also be used.

  8. Erstellen Sie einen neuen Ordner namens NumberGuessWorkflowActivities_du im gleichen Ordner wie NumberGuessWorkflowHost, NumberGuessWorkflowActivities, und die neu hinzugefügt PreviousVersions Ordner und kopieren Sie alle Dateien und Unterordner aus dem NumberGuessWorkflowActivities Ordner in das neue NumberGuessWorkflowActivities_du Ordner.Create a new folder named NumberGuessWorkflowActivities_du in the same folder as NumberGuessWorkflowHost, NumberGuessWorkflowActivities, and the newly added PreviousVersions folder, and copy all of the files and subfolders from the NumberGuessWorkflowActivities folder into the new NumberGuessWorkflowActivities_du folder. Diese Sicherungskopie des Projekts für die erste Version der Aktivitäten werden in Vorgehensweise: Aktualisieren der Definition einer ausgeführten Workflowinstanz.This backup copy of the project for the initial version of the activities is used in How to: Update the Definition of a Running Workflow Instance.

  9. Öffnen Sie erneut die WF45GettingStartedTutorial -Lösung in Visual Studio 2012.Re-open the WF45GettingStartedTutorial solution in Visual Studio 2012.

Aktualisieren von workflowsTo update the workflows

In diesem Abschnitt werden die Workflowdefinitionen aktualisiert.In this section, the workflow definitions are updated. Die beiden WriteLine-Aktivitäten, die Feedback zum Schätzwert des Benutzers geben, werden aktualisiert, und es wird eine neue WriteLine-Aktivität hinzugefügt, die zusätzliche Informationen zum Spiel bereitstellt, nachdem die Zahl geschätzt wurde.The two WriteLine activities that give feedback on the user's guess are updated, and a new WriteLine activity is added that provides additional information about the game once the number is guessed.

StateMachine-Workflow aktualisierenTo update the StateMachine workflow

  1. In Projektmappen-Explorerunter der NumberGuessWorkflowActivities Projekt, doppelklicken Sie auf StateMachineNumberGuessWorkflow.xaml.In Solution Explorer, under the NumberGuessWorkflowActivities project, double-click StateMachineNumberGuessWorkflow.xaml.

  2. Doppelklicken Sie auf die Guess Incorrect Übergang für den Zustandsautomaten.Double-click the Guess Incorrect transition on the state machine.

  3. Aktualisieren Sie Text der äußersten linken WriteLine in der If-Aktivität.Update the Text of the left-most WriteLine in the If activity.

    Guess & " is too low."
    
    Guess + " is too low."
    
  4. Aktualisieren Sie Text der äußersten rechten WriteLine in der If-Aktivität.Update the Text of the right-most WriteLine in the If activity.

    Guess & " is too high."
    
    Guess + " is too high."
    
  5. Zurück zur allgemeinen zustandsautomatenansicht im Workflow-Designer durch Klicken auf StateMachine in der Brotkrümelnavigation angezeigt werden soll, am oberen Rand der Workflow-Designer.Return to the overall state machine view in the workflow designer by clicking StateMachine in the breadcrumb display at the top of the workflow designer.

  6. Doppelklicken Sie auf die Guess Correct Übergang für den Zustandsautomaten.Double-click the Guess Correct transition on the state machine.

  7. Ziehen Sie eine WriteLine Aktivität aus der primitive im Abschnitt der Toolbox auf die Drop Action-Aktivität hier Bezeichnung der Übergang.Drag a WriteLine activity from the Primitives section of the Toolbox and drop it on the Drop Action activity here label of the transition.

  8. Geben Sie den folgenden Ausdruck in das Eigenschaftsfeld Text ein.Type the following expression into the Text property box.

    Guess & " is correct. You guessed it in " & Turns & " turns."
    
    Guess + " is correct. You guessed it in " + Turns + " turns."
    

So aktualisieren Sie die Flussdiagramm-workflowTo update the Flowchart workflow

  1. In Projektmappen-Explorerunter der NumberGuessWorkflowActivities Projekt, doppelklicken Sie auf FlowchartNumberGuessWorkflow.xaml.In Solution Explorer, under the NumberGuessWorkflowActivities project, double-click FlowchartNumberGuessWorkflow.xaml.

  2. Aktualisieren Sie Text der äußersten linken WriteLine-Aktivität.Update the Text of the left-most WriteLine activity.

    Guess & " is too low."
    
    Guess + " is too low."
    
  3. Aktualisieren Sie Text der äußersten rechten WriteLine-Aktivität.Update the Text of the right-most WriteLine activity.

    Guess & " is too high."
    
    Guess + " is too high."
    
  4. Ziehen Sie eine WriteLine Aktivität aus der primitive im Abschnitt der Toolbox und legen Sie diese auf dem Ablagepunkt der True -Aktion der obersten FlowDecision .Drag a WriteLine activity from the Primitives section of the Toolbox and drop it on the drop point of the True action of the topmost FlowDecision. Die WriteLine-Aktivität wird dem Flussdiagramm hinzugefügt und mit der True-Aktion von FlowDecision verknüpft.The WriteLine activity is added to the flowchart and linked to the True action of the FlowDecision.

  5. Geben Sie den folgenden Ausdruck in das Eigenschaftsfeld Text ein.Type the following expression into the Text property box.

    Guess & " is correct. You guessed it in " & Turns & " turns."
    
    Guess + " is correct. You guessed it in " + Turns + " turns."
    

Aktualisieren Sie den sequenziellen workflowTo update the Sequential workflow

  1. In Projektmappen-Explorerunter der NumberGuessWorkflowActivities Projekt, doppelklicken Sie auf SequentialNumberGuessWorkflow.xaml.In Solution Explorer, under the NumberGuessWorkflowActivities project, double-click SequentialNumberGuessWorkflow.xaml.

  2. Aktualisieren Sie Text der äußersten linken WriteLine in der If-Aktivität.Update the Text of the left-most WriteLine in the If activity.

    Guess & " is too low."
    
    Guess + " is too low."
    
  3. Aktualisieren Sie Text der äußersten rechten WriteLine-Aktivität in der If-Aktivität.Update the Text of the right-most WriteLine activity in the If activity.

    Guess & " is too high."
    
    Guess + " is too high."
    
  4. Ziehen Sie eine WriteLine Aktivität aus der primitive im Abschnitt der Toolbox und legen Sie sie nach der DoWhile Aktivität, damit die WriteLine ist die letzte Aktivität in den Stamm Sequence Aktivität.Drag a WriteLine activity from the Primitives section of the Toolbox and drop it after the DoWhile activity so that the WriteLine is the final activity in the root Sequence activity.

  5. Geben Sie den folgenden Ausdruck in das Eigenschaftsfeld Text ein.Type the following expression into the Text property box.

    Guess & " is correct. You guessed it in " & Turns & " turns."
    
    Guess + " is correct. You guessed it in " + Turns + " turns."
    

So aktualisieren Sie WorkflowVersionMap, um die vorherigen workflowversionen einzuschließenTo update WorkflowVersionMap to include the previous workflow versions

  1. Doppelklicken Sie auf WorkflowVersionMap.cs (oder WorkflowVersionMap.vb) unter den NumberGuessWorkflowHost Projekt, um ihn zu öffnen.Double-click WorkflowVersionMap.cs (or WorkflowVersionMap.vb) under the NumberGuessWorkflowHost project to open it.

  2. Fügen Sie die folgenden using-Anweisungen (oder Imports-Anweisungen) mit den anderen using-Anweisungen (oder Imports-Anweisungen) am Anfang der Datei hinzu.Add the following using (or Imports) statements to the top of the file with the other using (or Imports) statements.

    Imports System.Reflection
    Imports System.IO
    
    using System.Reflection;
    using System.IO;
    
  3. Fügen Sie drei neue Workflowidentitäten direkt unterhalb der drei vorhandenen Deklarationen für Workflowidentitäten hinzu.Add three new workflow identities just below the three existing workflow identity declarations. Über diese neuen v1-Workflowidentitäten wird den Workflows, die vor den Updates gestartet wurden, die richtige Workflowdefinition bereitgestellt.These new v1 workflow identities will be used provide the correct workflow definition to workflows started before the updates were made.

    'Current version identities.
    Public StateMachineNumberGuessIdentity As WorkflowIdentity
    Public FlowchartNumberGuessIdentity As WorkflowIdentity
    Public SequentialNumberGuessIdentity As WorkflowIdentity
    
    'v1 Identities.
    Public StateMachineNumberGuessIdentity_v1 As WorkflowIdentity
    Public FlowchartNumberGuessIdentity_v1 As WorkflowIdentity
    Public SequentialNumberGuessIdentity_v1 As WorkflowIdentity
    
    // Current version identities.
    static public WorkflowIdentity StateMachineNumberGuessIdentity;
    static public WorkflowIdentity FlowchartNumberGuessIdentity;
    static public WorkflowIdentity SequentialNumberGuessIdentity;
    
    // v1 identities.
    static public WorkflowIdentity StateMachineNumberGuessIdentity_v1;
    static public WorkflowIdentity FlowchartNumberGuessIdentity_v1;
    static public WorkflowIdentity SequentialNumberGuessIdentity_v1;
    
  4. Aktualisieren Sie im WorkflowVersionMap-Konstruktor die Version-Eigenschaft der drei aktuellen Workflowidentitäten auf 2.0.0.0.In the WorkflowVersionMap constructor, update the Version property of the three current workflow identities to 2.0.0.0.

    'Add the current workflow version identities.
    StateMachineNumberGuessIdentity = New WorkflowIdentity With
    {
        .Name = "StateMachineNumberGuessWorkflow",
        .Version = New Version(2, 0, 0, 0)
    }
    
    FlowchartNumberGuessIdentity = New WorkflowIdentity With
    {
        .Name = "FlowchartNumberGuessWorkflow",
        .Version = New Version(2, 0, 0, 0)
    }
    
    SequentialNumberGuessIdentity = New WorkflowIdentity With
    {
        .Name = "SequentialNumberGuessWorkflow",
        .Version = New Version(2, 0, 0, 0)
    }
    
    map.Add(StateMachineNumberGuessIdentity, New StateMachineNumberGuessWorkflow())
    map.Add(FlowchartNumberGuessIdentity, New FlowchartNumberGuessWorkflow())
    map.Add(SequentialNumberGuessIdentity, New SequentialNumberGuessWorkflow())
    
    // Add the current workflow version identities.
    StateMachineNumberGuessIdentity = new WorkflowIdentity
    {
        Name = "StateMachineNumberGuessWorkflow",
        // Version = new Version(1, 0, 0, 0),
        Version = new Version(2, 0, 0, 0)
    };
    
    FlowchartNumberGuessIdentity = new WorkflowIdentity
    {
        Name = "FlowchartNumberGuessWorkflow",
        // Version = new Version(1, 0, 0, 0),
        Version = new Version(2, 0, 0, 0)
    };
    
    SequentialNumberGuessIdentity = new WorkflowIdentity
    {
        Name = "SequentialNumberGuessWorkflow",
        // Version = new Version(1, 0, 0, 0),
        Version = new Version(2, 0, 0, 0)
    };
    
    map.Add(StateMachineNumberGuessIdentity, new StateMachineNumberGuessWorkflow());
    map.Add(FlowchartNumberGuessIdentity, new FlowchartNumberGuessWorkflow());
    map.Add(SequentialNumberGuessIdentity, new SequentialNumberGuessWorkflow());
    

    Durch den darin enthaltenen Code werden dem Wörterbuch die aktuellen Workflowversionen hinzugefügt. Der Code verwendet die aktuellen Versionen, auf die im Projekt verwiesen wird. Aus diesem Grund muss der Code, durch den die Workflowdefinitionen initialisiert werden, nicht aktualisiert werden.The code in that adds the current versions of the workflows to the dictionary uses the current versions that are referenced in the project, so the code that initializes the workflow definitions does not need to be updated.

  5. Fügen Sie den folgenden Code im Konstruktor unmittelbar nach dem Code hinzu, durch den dem Wörterbuch die aktuellen Versionen hinzugefügt werden.Add the following code in the constructor just after the code that adds the current versions to the dictionary.

    'Initialize the previous workflow version identities.
    StateMachineNumberGuessIdentity_v1 = New WorkflowIdentity With
    {
        .Name = "StateMachineNumberGuessWorkflow",
        .Version = New Version(1, 0, 0, 0)
    }
    
    FlowchartNumberGuessIdentity_v1 = New WorkflowIdentity With
    {
        .Name = "FlowchartNumberGuessWorkflow",
        .Version = New Version(1, 0, 0, 0)
    }
    
    SequentialNumberGuessIdentity_v1 = New WorkflowIdentity With
    {
        .Name = "SequentialNumberGuessWorkflow",
        .Version = New Version(1, 0, 0, 0)
    }
    
    // Initialize the previous workflow version identities.
    StateMachineNumberGuessIdentity_v1 = new WorkflowIdentity
    {
        Name = "StateMachineNumberGuessWorkflow",
        Version = new Version(1, 0, 0, 0)
    };
    
    FlowchartNumberGuessIdentity_v1 = new WorkflowIdentity
    {
        Name = "FlowchartNumberGuessWorkflow",
        Version = new Version(1, 0, 0, 0)
    };
    
    SequentialNumberGuessIdentity_v1 = new WorkflowIdentity
    {
        Name = "SequentialNumberGuessWorkflow",
        Version = new Version(1, 0, 0, 0)
    };
    

    Diese Workflowidentitäten werden den ursprünglichen Versionen der entsprechenden Workflowdefinitionen zugeordnet.These workflow identities are associated with the initial versions of the corresponding workflow definitions.

  6. Als Nächstes laden Sie die Assembly, die die ursprüngliche Version der Workflowdefinitionen enthält, und erstellen die entsprechenden Workflowdefinitionen und fügen sie dem Wörterbuch hinzu.Next, load the assembly that contains the initial version of the workflow definitions, and create and add the corresponding workflow definitions to the dictionary.

    'Add the previous version workflow identities to the dictionary along with
    'the corresponding workflow definitions loaded from the v1 assembly.
    'Assembly.LoadFile requires an absolute path so convert this relative path
    'to an absolute path.
    Dim v1AssemblyPath As String = "..\..\..\PreviousVersions\NumberGuessWorkflowActivities_v1.dll"
    v1AssemblyPath = Path.GetFullPath(v1AssemblyPath)
    Dim v1Assembly As Assembly = Assembly.LoadFile(v1AssemblyPath)
    
    map.Add(StateMachineNumberGuessIdentity_v1,
        v1Assembly.CreateInstance("NumberGuessWorkflowActivities.StateMachineNumberGuessWorkflow"))
    
    map.Add(SequentialNumberGuessIdentity_v1,
        v1Assembly.CreateInstance("NumberGuessWorkflowActivities.SequentialNumberGuessWorkflow"))
    
    map.Add(FlowchartNumberGuessIdentity_v1,
        v1Assembly.CreateInstance("NumberGuessWorkflowActivities.FlowchartNumberGuessWorkflow"))
    
    // Add the previous version workflow identities to the dictionary along with
    // the corresponding workflow definitions loaded from the v1 assembly.
    // Assembly.LoadFile requires an absolute path so convert this relative path
    // to an absolute path.
    string v1AssemblyPath = @"..\..\..\PreviousVersions\NumberGuessWorkflowActivities_v1.dll";
    v1AssemblyPath = Path.GetFullPath(v1AssemblyPath);
    Assembly v1Assembly = Assembly.LoadFile(v1AssemblyPath);
    
    map.Add(StateMachineNumberGuessIdentity_v1,
        v1Assembly.CreateInstance("NumberGuessWorkflowActivities.StateMachineNumberGuessWorkflow") as Activity);
    
    map.Add(SequentialNumberGuessIdentity_v1,
        v1Assembly.CreateInstance("NumberGuessWorkflowActivities.SequentialNumberGuessWorkflow") as Activity);
    
    map.Add(FlowchartNumberGuessIdentity_v1,
        v1Assembly.CreateInstance("NumberGuessWorkflowActivities.FlowchartNumberGuessWorkflow") as Activity);
    

    Das folgende Beispiel enthält die vollständige Auflistung für die aktualisierte WorkflowVersionMap-Klasse.The following example is the complete listing for the updated WorkflowVersionMap class.

    Public Module WorkflowVersionMap
        Dim map As Dictionary(Of WorkflowIdentity, Activity)
    
        'Current version identities.
        Public StateMachineNumberGuessIdentity As WorkflowIdentity
        Public FlowchartNumberGuessIdentity As WorkflowIdentity
        Public SequentialNumberGuessIdentity As WorkflowIdentity
    
        'v1 Identities.
        Public StateMachineNumberGuessIdentity_v1 As WorkflowIdentity
        Public FlowchartNumberGuessIdentity_v1 As WorkflowIdentity
        Public SequentialNumberGuessIdentity_v1 As WorkflowIdentity
    
        Sub New()
            map = New Dictionary(Of WorkflowIdentity, Activity)
    
            'Add the current workflow version identities.
            StateMachineNumberGuessIdentity = New WorkflowIdentity With
            {
                .Name = "StateMachineNumberGuessWorkflow",
                .Version = New Version(2, 0, 0, 0)
            }
    
            FlowchartNumberGuessIdentity = New WorkflowIdentity With
            {
                .Name = "FlowchartNumberGuessWorkflow",
                .Version = New Version(2, 0, 0, 0)
            }
    
            SequentialNumberGuessIdentity = New WorkflowIdentity With
            {
                .Name = "SequentialNumberGuessWorkflow",
                .Version = New Version(2, 0, 0, 0)
            }
    
            map.Add(StateMachineNumberGuessIdentity, New StateMachineNumberGuessWorkflow())
            map.Add(FlowchartNumberGuessIdentity, New FlowchartNumberGuessWorkflow())
            map.Add(SequentialNumberGuessIdentity, New SequentialNumberGuessWorkflow())
    
            'Initialize the previous workflow version identities.
            StateMachineNumberGuessIdentity_v1 = New WorkflowIdentity With
            {
                .Name = "StateMachineNumberGuessWorkflow",
                .Version = New Version(1, 0, 0, 0)
            }
    
            FlowchartNumberGuessIdentity_v1 = New WorkflowIdentity With
            {
                .Name = "FlowchartNumberGuessWorkflow",
                .Version = New Version(1, 0, 0, 0)
            }
    
            SequentialNumberGuessIdentity_v1 = New WorkflowIdentity With
            {
                .Name = "SequentialNumberGuessWorkflow",
                .Version = New Version(1, 0, 0, 0)
            }
    
            'Add the previous version workflow identities to the dictionary along with
            'the corresponding workflow definitions loaded from the v1 assembly.
            'Assembly.LoadFile requires an absolute path so convert this relative path
            'to an absolute path.
            Dim v1AssemblyPath As String = "..\..\..\PreviousVersions\NumberGuessWorkflowActivities_v1.dll"
            v1AssemblyPath = Path.GetFullPath(v1AssemblyPath)
            Dim v1Assembly As Assembly = Assembly.LoadFile(v1AssemblyPath)
    
            map.Add(StateMachineNumberGuessIdentity_v1,
                v1Assembly.CreateInstance("NumberGuessWorkflowActivities.StateMachineNumberGuessWorkflow"))
    
            map.Add(SequentialNumberGuessIdentity_v1,
                v1Assembly.CreateInstance("NumberGuessWorkflowActivities.SequentialNumberGuessWorkflow"))
    
            map.Add(FlowchartNumberGuessIdentity_v1,
                v1Assembly.CreateInstance("NumberGuessWorkflowActivities.FlowchartNumberGuessWorkflow"))
        End Sub
    
        Public Function GetWorkflowDefinition(identity As WorkflowIdentity) As Activity
            Return map(identity)
        End Function
    
        Public Function GetIdentityDescription(identity As WorkflowIdentity) As String
            Return identity.ToString()
        End Function
    End Module
    
    public static class WorkflowVersionMap
    {
        static Dictionary<WorkflowIdentity, Activity> map;
    
        // Current version identities.
        static public WorkflowIdentity StateMachineNumberGuessIdentity;
        static public WorkflowIdentity FlowchartNumberGuessIdentity;
        static public WorkflowIdentity SequentialNumberGuessIdentity;
    
        // v1 identities.
        static public WorkflowIdentity StateMachineNumberGuessIdentity_v1;
        static public WorkflowIdentity FlowchartNumberGuessIdentity_v1;
        static public WorkflowIdentity SequentialNumberGuessIdentity_v1;
    
        static WorkflowVersionMap()
        {
            map = new Dictionary<WorkflowIdentity, Activity>();
    
            // Add the current workflow version identities.
            StateMachineNumberGuessIdentity = new WorkflowIdentity
            {
                Name = "StateMachineNumberGuessWorkflow",
                // Version = new Version(1, 0, 0, 0),
                Version = new Version(2, 0, 0, 0)
            };
    
            FlowchartNumberGuessIdentity = new WorkflowIdentity
            {
                Name = "FlowchartNumberGuessWorkflow",
                // Version = new Version(1, 0, 0, 0),
                Version = new Version(2, 0, 0, 0)
            };
    
            SequentialNumberGuessIdentity = new WorkflowIdentity
            {
                Name = "SequentialNumberGuessWorkflow",
                // Version = new Version(1, 0, 0, 0),
                Version = new Version(2, 0, 0, 0)
            };
    
            map.Add(StateMachineNumberGuessIdentity, new StateMachineNumberGuessWorkflow());
            map.Add(FlowchartNumberGuessIdentity, new FlowchartNumberGuessWorkflow());
            map.Add(SequentialNumberGuessIdentity, new SequentialNumberGuessWorkflow());
    
            // Initialize the previous workflow version identities.
            StateMachineNumberGuessIdentity_v1 = new WorkflowIdentity
            {
                Name = "StateMachineNumberGuessWorkflow",
                Version = new Version(1, 0, 0, 0)
            };
    
            FlowchartNumberGuessIdentity_v1 = new WorkflowIdentity
            {
                Name = "FlowchartNumberGuessWorkflow",
                Version = new Version(1, 0, 0, 0)
            };
    
            SequentialNumberGuessIdentity_v1 = new WorkflowIdentity
            {
                Name = "SequentialNumberGuessWorkflow",
                Version = new Version(1, 0, 0, 0)
            };
    
            // Add the previous version workflow identities to the dictionary along with
            // the corresponding workflow definitions loaded from the v1 assembly.
            // Assembly.LoadFile requires an absolute path so convert this relative path
            // to an absolute path.
            string v1AssemblyPath = @"..\..\..\PreviousVersions\NumberGuessWorkflowActivities_v1.dll";
            v1AssemblyPath = Path.GetFullPath(v1AssemblyPath);
            Assembly v1Assembly = Assembly.LoadFile(v1AssemblyPath);
    
            map.Add(StateMachineNumberGuessIdentity_v1,
                v1Assembly.CreateInstance("NumberGuessWorkflowActivities.StateMachineNumberGuessWorkflow") as Activity);
    
            map.Add(SequentialNumberGuessIdentity_v1,
                v1Assembly.CreateInstance("NumberGuessWorkflowActivities.SequentialNumberGuessWorkflow") as Activity);
    
            map.Add(FlowchartNumberGuessIdentity_v1,
                v1Assembly.CreateInstance("NumberGuessWorkflowActivities.FlowchartNumberGuessWorkflow") as Activity);
        }
    
        public static Activity GetWorkflowDefinition(WorkflowIdentity identity)
        {
            return map[identity];
        }
    
        public static string GetIdentityDescription(WorkflowIdentity identity)
        {
            return identity.ToString();
        }
    }
    

So erstellen und führen Sie die Anwendung ausTo build and run the application

  1. Drücken Sie STRG+UMSCHALT+B, um die Anwendung zu erstellen, und dann STRG+F5, um sie zu starten.Press CTRL+SHIFT+B to build the application, and then CTRL+F5 to start.

  2. Starten Sie einen neuen Workflow, indem Sie auf neues Spiel.Start a new workflow by clicking New Game. Die Version des Workflows wird unter dem Statusfenster angezeigt und gibt die aktualisierte Version der zugeordneten WorkflowIdentity an.The version of the workflow is displayed under the status window and reflects the updated version from the associated WorkflowIdentity. Notieren Sie die InstanceId, sodass Sie beim Abschluss des Workflows dessen Nachverfolgungsdatei anzeigen können. Geben Sie dann Schätzwerte ein, bis das Spiel abgeschlossen ist.Make a note of the InstanceId so you can view the tracking file for the workflow when it completes, and then enter guesses until the game is complete. Beachten Sie, wie sich der Schätzwert des Benutzers gemäß den Updates der WriteLine-Aktivitäten in den Informationen im Statusfenster verändert.Note how the user's guess is displayed in the information displayed in the status window based on the updates to the WriteLine activities.

    Please enter a number between 1 and 10
    5 is too high.
    Please enter a number between 1 and 10
    3 is too high.
    Please enter a number between 1 and 10
    1 is too low.
    Please enter a number between 1 and 10
    Congratulations, you guessed the number in 4 turns.
    

    Hinweis

    Der aktualisierte Text aus den WriteLine-Aktivitäten wird angezeigt, die Ausgabe der endgültigen, in diesem Thema hinzugefügten WriteLine-Aktivität jedoch nicht.The updated text from the WriteLine activities is displayed, but the output of the final WriteLine activity that was added in this topic is not. Das liegt daran, dass das Statusfenster vom PersistableIdle-Handler aktualisiert wird.That is because the status window is updated by the PersistableIdle handler. Da der Workflow abgeschlossen wird, statt nach der letzten Aktivität in den Leerlauf zu wechseln, wird der PersistableIdle-Handler nicht aufgerufen.Because the workflow completes and does not go idle after the final activity, the PersistableIdle handler is not called. Im Statusfenster wird jedoch eine ähnliche Meldung vom Completed-Handler angezeigt.However, a similar message is displayed in the status window by the Completed handler. Bei Bedarf kann Code dem Completed-Handler hinzugefügt werden, um den Text aus StringWriter zu extrahieren und ihn im Statusfenster anzuzeigen.If desired, code could be added to the Completed handler to extract the text from the StringWriter and display it to the status window.

  3. Öffnen Sie Windows Explorer, und navigieren Sie zu der NumberGuessWorkflowHost\bin\debug Ordner (oder "bin\Release" je nach den projekteinstellungen), und öffnen Sie die Nachverfolgungsdatei, die mit dem Editor, der entspricht mit dem abgeschlossenen Workflow.Open Windows Explorer and navigate to the NumberGuessWorkflowHost\bin\debug folder (or bin\release depending on your project settings) and open the tracking file using Notepad that corresponds to the completed workflow. Wenn Sie sich noch nicht vorgenommen haben die InstanceId, können Sie die richtige Nachverfolgungsdatei identifizieren, mit der Änderungsdatum Informationen im Windows-Explorer.If you did not make a note of the InstanceId, you can identify the correct tracking file by using the Date modified information in Windows Explorer.

    Please enter a number between 1 and 10
    5 is too high.
    Please enter a number between 1 and 10
    3 is too high.
    Please enter a number between 1 and 10
    1 is too low.
    Please enter a number between 1 and 10
    2 is correct. You guessed it in 4 turns.
    

    Die aktualisierte WriteLine-Ausgabe ist in der Nachverfolgungsdatei enthalten, einschließlich der Ausgabe der WriteLine-Aktivität, die diesem Thema hinzugefügt wurde.The updated WriteLine output is contained within the tracking file, including the output of the WriteLine that was added in this topic.

  4. Wechseln Sie zurück zur Anwendung zum Schätzen der Zahl, und wählen Sie einen der Workflows aus, die vor den Updates gestartet wurden.Switch back to the number guessing application and select one of the workflows that was started before the updates were made. Sie können die Version des aktuell ausgewählten Workflows anhand der Versionsinformationen identifizieren, die unter dem Statusfenster angezeigt werden.You can identify the version of the currently selected workflow by looking at the version information that is displayed below the status window. Geben Sie mehrere Schätzwerte ein. Sie werden feststellen, dass die Statusupdates mit der Ausgabe der WriteLine-Aktivität aus der vorherigen Version übereinstimmen und keine Schätzwerte des Benutzers enthalten.Enter some guesses and note that the status updates match the WriteLine activity output from the previous version, and do not include the user's guess. Das liegt daran, dass diese Workflows die vorherige Workflowdefinition verwenden, die nicht über die WriteLine-Updates verfügt.That is because these workflows are using the previous workflow definition that does not have the WriteLine updates.

    Im nächsten Schritt Vorgehensweise: Aktualisieren der Definition einer ausgeführten Workflowinstanz, die laufende v1 Workflowinstanzen werden aktualisiert, damit sie die neue Funktionen als enthalten die v2 Instanzen.In the next step, How to: Update the Definition of a Running Workflow Instance, the running v1 workflow instances are updated so they contain the new functionality as the v2 instances.