WorkflowInstance.EnqueueItem Méthode
Définition
Important
Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifiée avant sa publication. Microsoft exclut toute garantie, expresse ou implicite, concernant les informations fournies ici.
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.)