Compartilhar via


WorkflowInstance.EnqueueItem Método

Definição

Posta uma mensagem na fila de fluxo de trabalho especificada de forma síncrona.

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

O nome do WorkflowQueue.

item
Object

O objeto a ser enfileirado.

pendingWork
IPendingWork

Um IPendingWork que permite que o remetente seja notificado quando um item for entregue.

workItem
Object

Um objeto a ser passado para os métodos IPendingWork.

Exceções

queueName é uma referência nula (Nothing no Visual Basic).

O mecanismo de runtime de fluxo de trabalho não está em execução.

- ou -

A WorkflowQueue especificada por queueName não existe.

- ou -

A WorkflowQueue especificada por queueName não está habilitada.

Exemplos

O exemplo de código a seguir demonstra como usar EnqueueItem. Quando o WorkflowIdled evento ocorre, o OnWorkflowIdled método definido neste exemplo é chamado. Ele determina qual fluxo de trabalho está ocioso usando a WorkflowInstance propriedade e obtém uma coleção de itens enfileirados para a instância de fluxo de trabalho chamando o GetWorkflowQueueData método . O código itera sobre a coleção para determinar qual atividade está aguardando o evento que ociosidade do fluxo de trabalho. Em seguida, ele envia uma exceção para a fila de fluxo de trabalho usando o EnqueueItem método junto com o nome do item da fila de eventos.

Este exemplo de código faz parte do exemplo Canceling a Workflow SDK do arquivo Program.cs. Para obter mais informações, consulte Cancelando um fluxo de trabalho.

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

Comentários

Envia o item para o especificado WorkflowQueue. Se você quiser ser notificado quando a mensagem for entregue, poderá implementar IPendingWork em seu serviço e passar um workItem objeto e IPendingWork para EnqueueItem. Se você não quiser essa notificação, poderá passar uma referência nula (Nothing no Visual Basic) para pendingWork e workItem.

Ao usar esse método com um fluxo de trabalho de computador de estado, você pode obter uma exceção com a mensagem "A fila '{0}' não está habilitada". Isso acontece quando o estado atual do computador de estado não sabe como manipular um evento específico. Por exemplo, quando algum estado diferente do estado atual contém o EventDrivenActivity que contém o HandleExternalEventActivity que é representado pela fila '{0}'.

Observação

Não há garantia de que as mensagens sejam recebidas pela instância de fluxo de trabalho na ordem em que foram enviadas. Por exemplo, se receber uma mensagem em uma fila existente (Fila A) fizer com que um fluxo de trabalho crie outra fila (Fila B), que escuta outra mensagem enviada após a primeira mensagem, é possível que a segunda mensagem chegue primeiro e não seja recebida devido à sua fila ainda não ter sido criada. Para evitar esse problema, a segunda mensagem não deve ser enviada até que a presença da segunda fila seja verificada (usando GetWorkflowQueueData.)

Aplica-se a

Confira também