WorkflowInstance.EnqueueItem Méthode

Définition

Publie de façon synchrone un message dans la file d'attente de workflow spécifiée.

public:
 void EnqueueItem(IComparable ^ queueName, System::Object ^ item, System::Workflow::Runtime::IPendingWork ^ pendingWork, System::Object ^ workItem);
public void EnqueueItem (IComparable queueName, object item, System.Workflow.Runtime.IPendingWork pendingWork, object workItem);
member this.EnqueueItem : IComparable * obj * System.Workflow.Runtime.IPendingWork * obj -> unit
Public Sub EnqueueItem (queueName As IComparable, item As Object, pendingWork As IPendingWork, workItem As Object)

Paramètres

queueName
IComparable

Nom de l'objet WorkflowQueue.

item
Object

Objet à mettre en file d'attente.

pendingWork
IPendingWork

IPendingWork autorisant l'expéditeur à être notifié lorsque l'item est remis.

workItem
Object

Objet à passer aux méthodes IPendingWork.

Exceptions

queueName est une référence Null (Nothing en Visual Basic).

Le moteur d'exécution de workflow ne s'exécute pas.

- ou -

La WorkflowQueue spécifiée par queueName n'existe pas.

- ou -

La WorkflowQueue spécifiée par queueName n'est pas activée.

Exemples

L'exemple de code suivant illustre l'utilisation de EnqueueItem. Lorsque l'événement WorkflowIdled se produit, la méthode OnWorkflowIdled définie dans cet exemple est appelée. Il détermine quel workflow est désactivé à l’aide de la propriété WorkflowInstance puis obtient une collection d’éléments en file d’attente pour l’instance de workflow en appelant la méthode GetWorkflowQueueData. Le code itère au sein de la collection pour déterminer quelle activité attend l’événement ayant désactivé le workflow. Il envoie alors une exception à la file d'attente de workflow à l'aide de la méthode EnqueueItem avec le nom de l'élément de la file d'attente de l'événement.

Cet exemple de code fait partie de l'exemple du Kit de développement logiciel Canceling a Workflow (SDK) et provient du fichier Program.cs. Pour plus d’informations, consultez Annulation d’un flux de travail.

static void OnWorkflowIdled(object sender, WorkflowEventArgs e)
{
    WorkflowInstance workflow = e.WorkflowInstance;

    Console.WriteLine("\n...waiting for 3 seconds... \n");
    Thread.Sleep(3000);

    // what activity is blocking the workflow
    ReadOnlyCollection<WorkflowQueueInfo> wqi = workflow.GetWorkflowQueueData();
    foreach (WorkflowQueueInfo q in wqi)
    {
        EventQueueName eq = q.QueueName as EventQueueName;
        if (eq != null)
        {
            // get activity that is waiting for event
            ReadOnlyCollection<string> blockedActivity = q.SubscribedActivityNames;
            Console.WriteLine("Host: Workflow is blocked on " + blockedActivity[0]);

            // this event is never going to arrive eg. employee left the company
            // lets send an exception to this queue
            // it will either be handled by exception handler that was modeled in workflow
            // or the runtime will unwind running compensation handlers and exit the workflow
            Console.WriteLine("Host: This event is not going to arrive");
            Console.WriteLine("Host: Cancel workflow with unhandled exception");
            workflow.EnqueueItem(q.QueueName, new Exception("ExitWorkflowException"), null, null);
        }
    }
}
Shared Sub OnWorkflowIdled(ByVal sender As Object, ByVal e As WorkflowEventArgs)
    Dim workflow As WorkflowInstance = e.WorkflowInstance

    Console.WriteLine(vbCrLf + "...waiting for 3 seconds... " + vbCrLf)
    Thread.Sleep(3000)

    ' what activity is blocking the workflow
    Dim wqi As ReadOnlyCollection(Of WorkflowQueueInfo) = workflow.GetWorkflowQueueData()
    For Each q As WorkflowQueueInfo In wqi

        Dim eq As EventQueueName = TryCast(q.QueueName, EventQueueName)

        If eq IsNot Nothing Then
            ' get activity that is waiting for event
            Dim blockedActivity As ReadOnlyCollection(Of String) = q.SubscribedActivityNames
            Console.WriteLine("Host: Workflow is blocked on " + blockedActivity(0))

            ' this event is never going to arrive eg. employee left the company
            ' lets send an exception to this queue
            ' it will either be handled by exception handler that was modeled in workflow
            ' or the runtime will unwind running compensation handlers and exit the workflow
            Console.WriteLine("Host: This event is not going to arrive")
            Console.WriteLine("Host: Cancel workflow with unhandled exception")
            workflow.EnqueueItem(q.QueueName, New Exception("ExitWorkflowException"), Nothing, Nothing)
        End If
    Next
End Sub

Remarques

Envoie l'item dans la WorkflowQueue spécifiée. Si vous souhaitez être notifié lorsque le message est remis, vous pouvez implémenter IPendingWork dans votre service et passer un workItem et un objet IPendingWork à EnqueueItem. Si vous ne souhaitez pas telle notification, vous pouvez passer une référence Null (Nothing en Visual Basic) pour pendingWork et workItem.

Lorsque vous utilisez cette méthode avec un flux de travail de machine d’état, vous pouvez obtenir une exception avec le message « La file d’attente '{0}' n’est pas activée ». Cela se produit lorsque l’état actuel de l’ordinateur d’état ne sait pas comment gérer un événement spécifique. Par exemple, lorsqu'un état autre que l'état actuel contient la EventDrivenActivity contenant la HandleExternalEventActivity représentée par la file d'attente '{0}'.

Notes

Il n'est pas garanti que les messages soient reçus par l'instance de workflow dans l'ordre de leur envoi. Par exemple, si la réception d'un message dans une file d'attente existante (file d'attente A) entraîne la création d'une autre file d'attente (file d'attente B) par un workflow écoutant ensuite un message envoyé après le premier, il est possible que le deuxième message arrive en premier et ne soit pas reçu du fait que sa file d'attente n'a pas encore été créée. Pour empêcher ce problème, le deuxième message ne doit pas être envoyé tant que la présence de la deuxième file d'attente n'a pas été vérifiée (à l'aide de GetWorkflowQueueData.)

S’applique à

Voir aussi