WorkflowInstance.EnqueueItem Método
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
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 queueName
no 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.)