Freigeben über


WorkflowInstance.EnqueueItem Methode

Definition

Sendet synchron eine Meldung an die angegebene Workflowwarteschlange.

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)

Parameter

queueName
IComparable

Der Name von WorkflowQueue.

item
Object

Das in die Warteschlange einzureihende Objekt.

pendingWork
IPendingWork

IPendingWork ermöglicht die Benachrichtigung des Absenders, wenn item zugestellt wird.

workItem
Object

Ein an die IPendingWork-Methoden zu übergebendes Objekt.

Ausnahmen

queueName ist ein NULL-Verweis (Nothing in Visual Basic).

Die Workflowruntime-Engine wird nicht ausgeführt.

- oder -

Die WorkflowQueue, die unter queueName angegeben ist, ist nicht vorhanden.

- oder -

Die WorkflowQueue, die unter queueName angegeben ist, ist nicht aktiviert.

Beispiele

Das folgende Codebeispiel zeigt die Verwendung von EnqueueItem. Wenn das WorkflowIdled-Ereignis eintritt, wird die in diesem Beispiel definierte OnWorkflowIdled-Methode aufgerufen. Sie bestimmt, welcher Workflow mithilfe der WorkflowInstance-Eigenschaft in den Leerlauf versetzt wird, und ruft anschließend eine Auflistung mit in der Warteschlange befindlichen Elementen für den Workflow ab, indem die GetWorkflowQueueData-Methode aufgerufen wird. Der Code durchläuft die Auflistung, um zu ermitteln, welche Aktivität auf das Ereignis wartet, das den Workflow in den Leerlauf versetzt hat. Anschließend sendet er eine Ausnahme an die Workflowwarteschlange, indem er die EnqueueItem-Methode zusammen mit dem Namen des Ereigniswarteschlangenelements verwendet.

Dieses Codebeispiel ist Teil des Canceling a Workflow SDK-Beispiels in der Datei Program.cs. Weitere Informationen finden Sie unter Abbrechen eines Workflows.

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

Hinweise

Sendet das item an die angegebene WorkflowQueue. Wenn Sie benachrichtigt werden möchten, sobald die Meldung zugestellt wird, können Sie IPendingWork in Ihrem Dienst implementieren und ein workItem und ein IPendingWork-Objekt an EnqueueItem übergeben. Wenn Sie diese Benachrichtigung nicht verwenden möchten, können Sie einen NULL-Verweis (Nothing in Visual Basic) für pendingWork und workItem übergeben.

Wenn Sie diese Methode mit einem Zustandsautomatenworkflow verwenden, erhalten Sie möglicherweise eine Ausnahme mit der Meldung "Warteschlange '{0}' ist nicht aktiviert". Dies geschieht, wenn der aktuelle Zustand des Zustandscomputers nicht weiß, wie ein bestimmtes Ereignis behandelt werden soll. Beispiel: Ein Zustand, der nicht mit dem aktuellen Zustand übereinstimmt, beinhaltet die EventDrivenActivity, die die von der Warteschlange '{0}' dargestellte HandleExternalEventActivity beinhaltet.

Hinweis

Für Meldungen wird nicht garantiert, dass sie von der Workflowinstanz in der Reihenfolge empfangen werden, in der sie gesendet wurden. Wenn der Empfang einer Meldung in einer vorhandenen Warteschlange (Warteschlange A) z. B. dazu führt, dass eine weitere Warteschlange (Warteschlange B) erstellt wird, die nach der ersten Meldung auf eine weitere Meldung wartet, trifft die zweite Meldung ggf. zuerst ein und wird nicht empfangen, weil die dazugehörige Warteschlange noch nicht erstellt wurde. Um dies zu verhindern, sollte die zweite Meldung nicht gesendet werden, bevor das Vorhandensein der zweiten Warteschlange sichergestellt ist (mithilfe von GetWorkflowQueueData.)

Gilt für:

Weitere Informationen