WorkflowInstance.EnqueueItem Метод

Определение

Синхронно отправляет сообщение в указанную очередь рабочего процесса.

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)

Параметры

queueName
IComparable

Имя WorkflowQueue.

item
Object

Объект для постановки в очередь.

pendingWork
IPendingWork

Интерфейс IPendingWork, позволяющий отправителю получать уведомления при доставке элемента item.

workItem
Object

Объект, передаваемый в методы IPendingWork.

Исключения

Параметр queueName является неопределенной ссылкой (Nothing в Visual Basic).

Механизм среды выполнения рабочих процессов не работает.

-или-

Очередь WorkflowQueue, заданная именем queueName, не существует.

-или-

Очередь WorkflowQueue, заданная именем queueName, не включена.

Примеры

В следующем примере кода демонстрируется использование метода EnqueueItem. При возникновении события WorkflowIdled вызывается метод OnWorkflowIdled, определенный в этом примере. Он определяет, какой рабочий процесс бездействует, используя свойство WorkflowInstance, а затем возвращает коллекцию элементов, находящихся в очереди экземпляра рабочего потока, вызывая метод GetWorkflowQueueData. Код выполняет перебор элементов коллекции, чтобы определить, какое действие ожидает события, которое привело к бездействию рабочего процесса. После этого он отправляет исключение в очередь рабочего процесса, используя метод EnqueueItem с именем элемента очереди событий.

Данный пример кода является частью примера SDK «Canceling a Workflow» из файла Program.cs. Дополнительные сведения см. в разделе Отмена рабочего процесса.

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

Комментарии

Отправляет элемент item в указанную очередь WorkflowQueue. Если необходимо получать уведомления при доставке сообщений, то в службе можно реализовать интерфейс IPendingWork и передавать элемент workItem и объект IPendingWork в метод EnqueueItem. Если такое уведомление не требуется, то можно передать неопределенную ссылку (Nothing в Visual Basic) в качестве параметров pendingWork и workItem.

При использовании этого метода с рабочим процессом конечного автомата может возникнуть исключение с сообщением "Очередь "{0}" не включена". Это происходит, когда текущее состояние конечного автомата не знает, как обрабатывать определенное событие. Например, если какое-либо состояние, отличное от текущего, содержит действие EventDrivenActivity, содержащее действие HandleExternalEventActivity, которое представляется очередью "{0}".

Примечание

Порядок сообщений, получаемых экземпляром рабочего процесса, не обязательно будет соответствовать порядку, в котором они были отправлены. Например, если получение сообщения в существующей очереди (очередь A) приводит к тому, что рабочий процесс создает другую очередь (очередь B), которая затем ожидает другое сообщение, отправленное после первого, то есть вероятность, что второе сообщение поступит первым и не будет получено, так как его очередь еще не создана. Чтобы предотвратить эту проблему, не следует отправлять второе сообщение, пока не проверено наличие его очереди (с помощью метода GetWorkflowQueueData.)

Применяется к

См. также раздел