WorkflowInstance.EnqueueItem Método

Definición

Envía un mensaje a la cola del flujo de trabajo especificada sincrónicamente.

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)

Parámetros

queueName
IComparable

Nombre del objeto WorkflowQueue.

item
Object

Objeto que se va a poner en cola.

pendingWork
IPendingWork

IPendingWorkque permite notificar el remitente cuando se entrega el elemento item.

workItem
Object

Objeto que se pasará a los métodos IPendingWork.

Excepciones

queueName es una referencia nula (Nothing en Visual Basic).

El motor en tiempo de ejecución de flujo de trabajo no está en ejecución.

o bien

WorkflowQueue especificado por queueName no existe.

o bien

WorkflowQueue especificado por queueNameno está habilitado.

Ejemplos

En el ejemplo de código siguiente se muestra cómo utilizar EnqueueItem. Cuando se produce el evento WorkflowIdled, se llama al método OnWorkflowIdled definido en este ejemplo. Determina qué flujo de trabajo está inactivo utilizando la propiedad WorkflowInstance y, a continuación, obtiene una colección de elementos en cola para la instancia de flujo de trabajo llamando al método GetWorkflowQueueData. El código itera sobre la colección para determinar qué actividad está esperando para el evento que ralentizó el flujo de trabajo. Envía a continuación una excepción a la cola del flujo de trabajo utilizando el método EnqueueItem junto con el nombre del elemento de cola de evento.

Este ejemplo de código forma parte de la muestra de SDK Cancelar un Flujo de trabajo, del archivo Program.cs. Para obtener más información, consulte Cancelación de un flujo de trabajo.

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

Comentarios

Envía el item al WorkflowQueue especificado. Si quiere recibir una notificación cuando se entregue el mensaje, puede implementar IPendingWork en su servicio y pasar workItem y un objeto IPendingWork a EnqueueItem. Si no quiere recibir una notificación, puede pasar una referencia nula (Nothing en Visual Basic) para pendingWork y workItem.

Al usar este método con un flujo de trabajo de máquina de estado, puede obtener una excepción con el mensaje "Cola '{0}' no está habilitada". Esto sucede cuando el estado actual de la máquina de estado no sabe cómo controlar un evento específico. Por ejemplo, cuando un estado distinto del estado actual contiene la EventDrivenActivity que contiene la HandleExternalEventActivity que está representada por la cola' {0}.'

Nota:

No se garantiza que la instancia de flujo de trabajo envíe los mensajes en el orden en que se enviaron. Por ejemplo, si al recibir un mensaje en una cola existente (Cola A) un flujo de trabajo crea otra cola (Cola B) que, a continuación, escucha otros mensaje enviados después del primer mensaje, es posible que el segundo mensaje llegue primero, y que no se reciba debido a que todavía no se ha creado su cola. Para evitar este problema, no se debería enviar el segundo mensaje hasta que se compruebe la presencia de la segunda cola (utilizar GetWorkflowQueueData.)

Se aplica a

Consulte también