Partager via


Procédure : créer et exécuter un workflow de longue durée

Cette rubrique s'applique à Windows Workflow Foundation 4.

L'une des fonctionnalités centrales de Windows Workflow Foundation (WF) est la capacité de l'exécution à rendre persistants et à décharger les workflows inactifs dans une base de données. Cette rubrique montre comment créer la base de données locale pour la persistance du workflow et activer la persistance dans une application de workflow.

Dd489452.note(fr-fr,VS.100).gifRemarque :
Chaque rubrique du didacticiel de mise en route dépend des rubriques précédentes. Pour effectuer cette rubrique, vous devez d'abord effectuer Procédure : créer une activité, Procédure : créer un workflow et Procédure : exécuter un workflow.

Pour créer la base de données de persistance

  1. Ouvrez SQL Server Management Studio et connectez-vous au serveur local. Cliquez avec le bouton droit sur le nœud Bases de données sur le serveur local et sélectionnez Nouvelle base de données. Nommez la nouvelle base de données Persistence, acceptez toutes les autres valeurs et sélectionnez OK.

    Dd489452.note(fr-fr,VS.100).gifRemarque :
    Vérifiez que vous avez l'autorisation Créer une base de données sur le serveur local avant d'essayer de créer une base de données.

  2. Cliquez avec le bouton droit sur la nouvelle base de données Persistence et sélectionnez Nouvelle requête. Ouvrez le dossier suivant : C:\Windows\Microsoft.NET\Framework\<version actuelle>\sql\en. Faites glisser les fichiers suivants dans la fenêtre Requête et exécutez-les dans l'ordre suivant :

    • SqlWorkflowInstanceStoreSchema.sql

    • SqlWorkflowInstanceStoreLogic.sql

Pour activer la persistance dans une application de workflow

  1. Cliquez avec le bouton droit sur WorkflowConsoleApplication1 dans l'Explorateur de solutions et sélectionnez Ajouter une référence.

  2. Sélectionnez System.Activities.DurableInstancing et System.Runtime.DurableInstancing à partir de l'onglet .NET et cliquez sur OK.

  3. Ouvrez Program.cs (Module1.vb pour Visual Basic) dans le projet WorkflowConsoleApplication1. Dans la classe Program (Module1 pour Visual Basic), déclarez une constante de chaîne qui définit une chaîne de connexion pour la base de données de persistance que vous avez créée dans la première procédure.

    Const connectionString As String = "Server=.\\SQLEXPRESS;Initial Catalog=Persistence;Integrated Security=SSPI"
    
    const string connectionString = "Server=.\\SQLEXPRESS;Initial Catalog=Persistence;Integrated Security=SSPI";
    
    Dd489452.note(fr-fr,VS.100).gifRemarque :
    Selon votre édition de SQL Server, le nom du serveur de chaîne de connexion peut être différent.

  4. Ajoutez ensuite une instruction using ou Imports pour System.Activities.DurableInstancing dans le fichier Program.cs ou Module1.vb.

    Imports System.Activities.DurableInstancing
    
    using System.Activities.DurableInstancing;
    
  5. Dans la méthode Main qui suit le code qui crée le WorkflowApplication, créez un SqlWorkflowInstanceStore et affectez-le au InstanceStore du WorkflowApplication.

    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;
    
  6. Indiquez ensuite au workflow d'assurer la persistance lorsqu'il devient inactif. Pour cela, remplacez le délégué pour l'événement Idle qui a été ajouté dans la rubrique précédente par le code suivant qui gère PersistableIdle.

    ' 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;
    };
    
    Dd489452.note(fr-fr,VS.100).gifRemarque :
    L'énumération PersistableIdleAction a trois valeurs : None, Persist et Unload. Persist entraîne la persistance du workflow, mais pas son déchargement. Unload entraîne la persistance et le déchargement du workflow. Une fois l'instance déchargée, le WorkflowApplication est supprimé et un nouvel objet WorkflowApplication est requis pour l'interaction suivante avec le workflow déchargé. Dans cette rubrique, Persist est utilisé afin que le workflow reste en mémoire et que le WorkflowApplication ne soit pas supprimé. Pour obtenir un exemple d'utilisation d'un WorkflowApplication avec la valeur d'énumération Unload, consultez l'exemple Persistance d'une application de workflow.

  7. À la fin de la méthode Main, ajoutez les lignes de code suivantes. WorkflowApplication décharge automatiquement l'instance de workflow de la mémoire une fois le jeu terminé et supprime l'enregistrement de persistance de la base de données.

    Console.WriteLine("Press any key to continue . . .")
    Console.ReadKey()
    
    Console.WriteLine("Press any key to continue . . .");
    Console.ReadKey();
    
    Dd489452.note(fr-fr,VS.100).gifRemarque :
    Lorsque l'exécution du workflow est terminée, l'enregistrement de persistance pour le workflow est supprimé. Dans cet exemple, sans le Console.ReadKey, l'application hôte s'arrête immédiatement à la fin du workflow. Étant donné que le nettoyage de persistance se produit sur un thread d'arrière-plan, il n'a aucune possibilité de terminer son travail si l'hôte s'arrête avant qu'il ne soit terminé. Une autre façon d'empêcher l'hôte de s'arrêter avant la fin de l'opération de persistance consiste à faire en sorte qu'il se bloque jusqu'à ce que l'événement Unloaded se produise à la fin de l'exécution du workflow. À la fin de l'exécution du workflow, il n'est pas déchargé tant que le travail d'arrière-plan, tel que la suppression du workflow terminé de la persistance, n'est pas terminé.

  8. Pour tester la persistance, appuyez sur F5 pour démarrer l'application et revenir à SQL Server Management Studio. Développez le nœud de la base de données Persistence (ou le nœud de base de données Master si vous avez créé les tables de persistance dans la base de données Master) et le nœud Tables dans la base de données Persistence. Cliquez avec le bouton droit sur la table InstancesTable et sélectionnez Sélectionner les 1000 lignes du haut. Une ligne doit être affichée, avec l'ID du workflow rendu persistant.

    Jouez ensuite le jeu pour terminer le workflow. Une fois le jeu terminé, revenez à SQL Server Management Studio et exécutez une nouvelle fois la requête. Notez qu'aucun enregistrement de persistance n'est retourné.

    Vous avez terminé le didacticiel de mise en route.