Procedura: Ospitare più versioni di un flusso di lavoro side-by-sideHow to: Host Multiple Versions of a Workflow Side-by-Side

WorkflowIdentity offre agli sviluppatori di applicazioni flusso di lavoro un modo per associare un nome e una versione a una definizione del flusso di lavoro. Consente inoltre di associare queste informazioni a un'istanza persistente del flusso di lavoro.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. Queste informazioni di identità possono essere usate dagli sviluppatori di applicazioni flusso di lavoro per scenari quali l'esecuzione affiancata di più versioni di una definizione del flusso di lavoro e costituiscono un elemento fondamentale per altre funzionalità come l'aggiornamento dinamico.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 questo passaggio dell'esercitazione viene illustrato come usare WorkflowIdentity per ospitare più versioni di un flusso di lavoro contemporaneamente.This step in the tutorial demonstrates how to use WorkflowIdentity to host multiple versions of a workflow at the same time.

Nota

Per scaricare una versione completa o visualizzare una procedura dettagliata del video dell'esercitazione, vedere Windows Workflow Foundation (WF45)-Introduzione esercitazione.To download a completed version or view a video walkthrough of the tutorial, see Windows Workflow Foundation (WF45) - Getting Started Tutorial.

Contenuto dell'argomentoIn this topic

In questo passaggio dell'esercitazione, le attività di WriteLine nel flusso di lavoro vengono modificate per fornire informazioni aggiuntive e viene aggiunta una nuova attività WriteLine.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. Una copia dell'assembly originale del flusso di lavoro viene archiviata e l'applicazione host viene aggiornata in modo da poter eseguire il flusso di lavoro originale e aggiornato contemporaneamente.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.

Nota

Prima di effettuare i passaggi di questo argomento, eseguire l'applicazione, avviare diversi flussi di lavoro di ogni tipo ed effettuare uno o due tentativi per ciascuno di essi.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. Questi flussi di lavoro salvati in modo permanente vengono usati in questo passaggio e nel passaggio seguente: Aggiornare la definizione di un'istanzadel flusso di lavoro in esecuzione.These persisted workflows are used in this step and the following step, How to: Update the Definition of a Running Workflow Instance.

Nota

Ogni passaggio nell'Esercitazione introduttiva dipende dai passaggi precedenti.Each step in the Getting Started tutorial depends on the previous steps. Se non sono stati completati i passaggi precedenti, è possibile scaricare una versione completa dell'esercitazione da Windows Workflow Foundation (WF45)-Introduzione esercitazione.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.

Per creare una copia del progetto NumberGuessWorkflowActivitiesTo make a copy of the NumberGuessWorkflowActivities project

  1. Aprire la soluzione WF45GettingStartedTutorial in Visual Studio 2012 se non è aperta.Open the WF45GettingStartedTutorial solution in Visual Studio 2012 if it is not open.

  2. Per compilare la soluzione, premere CTRL+MAIUSC+B.Press CTRL+SHIFT+B to build the solution.

  3. Chiudere la soluzione WF45GettingStartedTutorial .Close the WF45GettingStartedTutorial solution.

  4. Aprire Esplora risorse e passare alla cartella in cui si trova il file della soluzione di esercitazione e le cartelle del progetto.Open Windows Explorer and navigate to the folder where the tutorial solution file and the project folders are located.

  5. Creare una nuova cartella denominata PreviousVersions nella stessa cartella di NumberGuessWorkflowHost e NumberGuessWorkflowActivities.Create a new folder named PreviousVersions in the same folder as NumberGuessWorkflowHost and NumberGuessWorkflowActivities. Questa cartella è usata per contenere gli assembly che includono le diverse versioni dei flussi di lavoro usate nei passaggi successivi dell'esercitazione.This folder is used to contain the assemblies that contain the different versions of the workflows used in the subsequent tutorial steps.

  6. Passare alla cartella NumberGuessWorkflowActivities\bin\debug (o bin\release a seconda delle impostazioni del progetto).Navigate to the NumberGuessWorkflowActivities\bin\debug folder (or bin\release depending on your project settings). Copiare NumberGuessWorkflowActivities. dll e incollarlo nella cartella PreviousVersions .Copy NumberGuessWorkflowActivities.dll and paste it into the PreviousVersions folder.

  7. Rinominare NumberGuessWorkflowActivities. dll nella cartella PreviousVersions in NumberGuessWorkflowActivities_v1. dll.Rename NumberGuessWorkflowActivities.dll in the PreviousVersions folder to NumberGuessWorkflowActivities_v1.dll.

    Nota

    Nei passaggi di questo argomento viene illustrato un modo per gestire gli assembly usati per contenere più versioni dei flussi di lavoro.The steps in this topic demonstrate one way to manage the assemblies used to contain multiple versions of the workflows. È anche possibile usare altri metodi, come l'assegnazione dei nomi sicuri agli assembly e la registrazione degli assembly nella Global Assembly Cache.Other methods such as strong naming the assemblies and registering them in the global assembly cache could also be used.

  8. Creare una nuova cartella denominata NumberGuessWorkflowActivities_du nella stessa cartella di NumberGuessWorkflowHost, NumberGuessWorkflowActivitiese la cartella PreviousVersions appena aggiunta, quindi copiare tutti i file e sottocartelle dalla cartella NumberGuessWorkflowActivities nella nuova cartella NumberGuessWorkflowActivities_du .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. Questa copia di backup del progetto per la versione iniziale delle attività viene usata in procedura: Aggiornare la definizione di un'istanzadel flusso di lavoro in esecuzione.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. Riaprire la soluzione WF45GettingStartedTutorial in Visual Studio 2012.Re-open the WF45GettingStartedTutorial solution in Visual Studio 2012.

Per aggiornare i flussi di lavoroTo update the workflows

Questa sezione aggiorna le definizioni di flusso di lavoro.In this section, the workflow definitions are updated. Le due attività WriteLine che forniscono il feedback sul tentativo dell'utente vengono aggiornate e viene aggiunta una nuova attività WriteLine che fornisce informazioni aggiuntive sul gioco una volta determinato il numero.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.

Per aggiornare il flusso di lavoro StateMachineTo update the StateMachine workflow

  1. In Esplora soluzioni, nel progetto NumberGuessWorkflowActivities , fare doppio clic su StateMachineNumberGuessWorkflow. XAML.In Solution Explorer, under the NumberGuessWorkflowActivities project, double-click StateMachineNumberGuessWorkflow.xaml.

  2. Fare doppio clic sulla transizione Guess errato sulla macchina a Stati.Double-click the Guess Incorrect transition on the state machine.

  3. Aggiornare l'oggetto Text di WriteLine all'estrema sinistra dell'attività If.Update the Text of the left-most WriteLine in the If activity.

    Guess & " is too low."
    
    Guess + " is too low."
    
  4. Aggiornare l'oggetto Text di WriteLine all'estrema destra dell'attività If.Update the Text of the right-most WriteLine in the If activity.

    Guess & " is too high."
    
    Guess + " is too high."
    
  5. Tornare alla visualizzazione complessiva della macchina a stati nella finestra di progettazione del flusso di lavoro facendo clic su StateMachine nella parte superiore della finestra di progettazione del flusso di lavoro.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. Fare doppio clic sulla transizione Guess Correct nella macchina a Stati.Double-click the Guess Correct transition on the state machine.

  7. Trascinare un'attività WriteLine dalla sezione primitive della casella degli strumenti e rilasciarla sull'etichetta rilasciare l'attività azione qui della transizione.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. Digitare l'espressione seguente nella casella della proprietà Text.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."
    

Per aggiornare il flusso di lavoro del diagramma di flussoTo update the Flowchart workflow

  1. In Esplora soluzioni, nel progetto NumberGuessWorkflowActivities , fare doppio clic su FlowchartNumberGuessWorkflow. XAML.In Solution Explorer, under the NumberGuessWorkflowActivities project, double-click FlowchartNumberGuessWorkflow.xaml.

  2. Aggiornare l'oggetto Text dell'attività WriteLine all'estrema sinistra.Update the Text of the left-most WriteLine activity.

    Guess & " is too low."
    
    Guess + " is too low."
    
  3. Aggiornare l'oggetto Text dell'attività WriteLine all'estrema destra.Update the Text of the right-most WriteLine activity.

    Guess & " is too high."
    
    Guess + " is too high."
    
  4. Trascinare un'attività WriteLine dalla sezione primitive della casella degli strumenti e rilasciarla sul punto di rilascio dell' True azione del FlowDecisionlivello superiore.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. L'attività di WriteLine viene aggiunta al diagramma di flusso e collegata all'azione True di FlowDecision.The WriteLine activity is added to the flowchart and linked to the True action of the FlowDecision.

  5. Digitare l'espressione seguente nella casella della proprietà Text.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."
    

Per aggiornare il flusso di lavoro sequenzialeTo update the Sequential workflow

  1. In Esplora soluzioni, nel progetto NumberGuessWorkflowActivities , fare doppio clic su SequentialNumberGuessWorkflow. XAML.In Solution Explorer, under the NumberGuessWorkflowActivities project, double-click SequentialNumberGuessWorkflow.xaml.

  2. Aggiornare l'oggetto Text di WriteLine all'estrema sinistra dell'attività If.Update the Text of the left-most WriteLine in the If activity.

    Guess & " is too low."
    
    Guess + " is too low."
    
  3. Aggiornare l'oggetto Text dell'attività WriteLine all'estrema destra dell'attività If.Update the Text of the right-most WriteLine activity in the If activity.

    Guess & " is too high."
    
    Guess + " is too high."
    
  4. Trascinare un'attività WriteLine dalla sezione primitive della casella degli strumenti e rilasciarla dopo l'attività DoWhile in modo che WriteLine sia l'attività finale nell'attività Sequence radice.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. Digitare l'espressione seguente nella casella della proprietà Text.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."
    

Per aggiornare WorkflowVersionMap in modo da includere le versioni precedenti del flusso di lavoroTo update WorkflowVersionMap to include the previous workflow versions

  1. Fare doppio clic su WorkflowVersionMap.cs (o WorkflowVersionMap. vb) nel progetto NumberGuessWorkflowHost per aprirlo.Double-click WorkflowVersionMap.cs (or WorkflowVersionMap.vb) under the NumberGuessWorkflowHost project to open it.

  2. Aggiungere le seguenti istruzioni using (o Imports) nella parte superiore del file con le altre istruzioni using (o Imports).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. Aggiungere tre nuove identità del flusso di lavoro subito dopo le tre dichiarazioni di identità del flusso di lavoro esistenti.Add three new workflow identities just below the three existing workflow identity declarations. Queste nuove identità del flusso di lavoro v1 verranno usate per fornire la definizione corretta del flusso di lavoro ai flussi di lavoro avviati prima dell'applicazione degli aggiornamenti.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. Nel costruttore WorkflowVersionMap, aggiornare la proprietà Version delle tre identità correnti del flusso di lavoro a 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());
    

    Il codice che aggiunge le versioni correnti dei flussi di lavoro al dizionario usa le versioni correnti a cui si fa riferimento nel progetto, in modo che il codice che inizializza le definizioni dei flusso di lavoro non deve essere aggiornato.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. Aggiungere il seguente codice nel costruttore immediatamente dopo il codice che aggiunge le versioni correnti al dizionario.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)
    };
    

    Queste identità del flusso di lavoro sono associate alle versioni iniziali delle corrispondenti definizioni di flusso di lavoro.These workflow identities are associated with the initial versions of the corresponding workflow definitions.

  6. Quindi, caricare l'assembly contenente la versione iniziale delle definizioni di flusso di lavoro e creare e aggiungere le definizioni corrispondenti di flusso di lavoro al dizionario.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);
    

    L'esempio seguente è l'elenco di codice per la classe WorkflowVersionMap aggiornata.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();
        }
    }
    

Per compilare ed eseguire l'applicazioneTo build and run the application

  1. Premere CTRL+MAIUSC+B per compilare l'applicazione, quindi premere CTRL+F5 per avviarla.Press CTRL+SHIFT+B to build the application, and then CTRL+F5 to start.

  2. Avviare un nuovo flusso di lavoro facendo clic su nuovo gioco.Start a new workflow by clicking New Game. La versione del flusso di lavoro viene visualizzata nella finestra di stato e riflette la versione aggiornata dall'oggetto WorkflowIdentity associato.The version of the workflow is displayed under the status window and reflects the updated version from the associated WorkflowIdentity. Prendere nota di InstanceId in modo da poter visualizzare il file di traccia per il flusso di lavoro quando viene completato e quindi immettere i tentativi fino al termine del gioco.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. Si noti in che modo la stima dell'utente viene visualizzata tra le informazioni riportate nella finestra di stato in base agli aggiornamenti alle attività WriteLine.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.
    

    Nota

    Viene visualizzato il testo aggiornato dalle attività WriteLine, ma non l'output dell'attività finale WriteLine aggiunta in questo argomento.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. Ciò accade perché la finestra di stato viene aggiornata dal gestore PersistableIdle.That is because the status window is updated by the PersistableIdle handler. Poiché il flusso di lavoro viene completato e non risulta inattivo dopo l'attività finale, il gestore PersistableIdle non viene chiamato.Because the workflow completes and does not go idle after the final activity, the PersistableIdle handler is not called. Tuttavia, viene visualizzato un messaggio simile nella finestra di stato dal gestore Completed.However, a similar message is displayed in the status window by the Completed handler. Se necessario, è possibile aggiungere il codice al gestore Completed per estrarre il testo da StringWriter e per visualizzarlo nella finestra di stato.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. Aprire Esplora risorse e passare alla cartella NumberGuessWorkflowHost\bin\debug (o bin\release a seconda delle impostazioni del progetto) e aprire il file di rilevamento utilizzando il blocco note corrispondente al flusso di lavoro completato.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. Se non è stata annotata la InstanceId, è possibile identificare il file di rilevamento corretto utilizzando le informazioni modificate in Esplora risorse.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.
    

    L'output di WriteLine aggiornato è contenuto nel file di rilevamento, incluso l'output di WriteLine aggiornato in questo argomento.The updated WriteLine output is contained within the tracking file, including the output of the WriteLine that was added in this topic.

  4. Passare di nuovo all'applicazione per determinare il numero e selezionare uno dei flussi di lavoro avviato prima dell'applicazione degli aggiornamenti.Switch back to the number guessing application and select one of the workflows that was started before the updates were made. È possibile identificare la versione del flusso di lavoro attualmente selezionato esaminando le informazioni sulla versione visualizzate nella finestra di stato.You can identify the version of the currently selected workflow by looking at the version information that is displayed below the status window. Immettere alcuni tentativi e notare che gli aggiornamenti di stato corrispondono all'output dell'attività WriteLine della versione precedente e non includono il tentativo dell'utente.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. Questo perché questi flussi di lavoro usano la definizione precedente del flusso di lavoro che non presenta gli aggiornamenti di WriteLine.That is because these workflows are using the previous workflow definition that does not have the WriteLine updates.

    Nel passaggio successivo, procedura: Aggiornare la definizione di un'istanzadel flusso di lavoro in esecuzione, le istanze del flusso di lavoro in esecuzione v1 vengono aggiornate v2 in modo che contengano la nuova funzionalità come istanze di.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.