WorkflowInstance.EnqueueItem Metoda
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Wysyła komunikat do określonej kolejki przepływu pracy synchronicznie.
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)
Parametry
- queueName
- IComparable
Nazwa elementu WorkflowQueue.
- item
- Object
Obiekt do kolejkowania.
- pendingWork
- IPendingWork
Element IPendingWork , który umożliwia nadawcy powiadomienie o item
dostarczaniu.
- workItem
- Object
Obiekt, który ma zostać przekazany do IPendingWork metod.
Wyjątki
queueName
jest odwołaniem o wartości null (Nothing
w Visual Basic).
Aparat środowiska uruchomieniowego przepływu pracy nie jest uruchomiony.
-lub-
Określony WorkflowQueue przez queueName
nie istnieje.
-lub-
Określony WorkflowQueue przez queueName
nie jest włączony.
Przykłady
W poniższym przykładzie kodu pokazano, jak używać polecenia EnqueueItem. Po wystąpieniu zdarzenia wywoływana WorkflowIdled jest metoda zdefiniowana OnWorkflowIdled
w tym przykładzie. Określa, który przepływ pracy jest bezczynny przy użyciu WorkflowInstance właściwości, a następnie pobiera kolekcję elementów w kolejce dla wystąpienia przepływu pracy przez wywołanie GetWorkflowQueueData metody . Kod wykonuje iterację w kolekcji, aby określić, które działanie oczekuje na zdarzenie, które bezczynnie przepływ pracy. Następnie wysyła wyjątek do kolejki przepływu pracy przy użyciu EnqueueItem metody wraz z nazwą elementu kolejki zdarzeń.
Ten przykład kodu jest częścią przykładu Canceling a Workflow SDK from the Program.cs file (Anulowanie zestawu SDK przepływu pracy z pliku Program.cs). Aby uzyskać więcej informacji, zobacz Anulowanie przepływu pracy.
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
Uwagi
Wysyła element item
do określonego WorkflowQueueelementu . Jeśli chcesz otrzymywać powiadomienia o dostarczaniu komunikatu, możesz zaimplementować IPendingWork w usłudze i przekazać workItem
obiekt i IPendingWork do EnqueueItemobiektu . Jeśli nie chcesz otrzymywać takiego powiadomienia, możesz przekazać odwołanie o wartości null (Nothing
w języku Visual Basic) dla pendingWork
i workItem
.
W przypadku korzystania z tej metody z przepływem pracy maszyny stanu może wystąpić wyjątek z komunikatem "Kolejka "{0}" nie jest włączona. Dzieje się tak, gdy bieżący stan maszyny stanu nie wie, jak obsłużyć określone zdarzenie. Jeśli na przykład jakiś stan inny niż bieżący zawiera EventDrivenActivity element, który zawiera HandleExternalEventActivity element reprezentowany przez kolejkę "{0}".
Uwaga
Komunikaty nie są gwarantowane przez wystąpienie przepływu pracy w kolejności, w której zostały wysłane. Na przykład jeśli odbieranie komunikatu w istniejącej kolejce (kolejka A) powoduje utworzenie innej kolejki (kolejka B), która następnie nasłuchuje innego komunikatu wysłanego po pierwszym komunikacie, możliwe, że drugi komunikat zostanie odebrany jako pierwszy i nie zostanie odebrany z powodu braku jeszcze utworzonej kolejki. Aby zapobiec temu problemowi, drugi komunikat nie powinien być wysyłany do momentu zweryfikowania obecności drugiej kolejki (przy użyciu polecenia GetWorkflowQueueData).