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.)