Sdílet prostřednictvím


WorkflowInstance.EnqueueItem Metoda

Definice

Odešle zprávu do zadané fronty pracovního postupu synchronně.

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

Název procesu WorkflowQueue.

item
Object

Objekt, který se má zařadit do fronty.

pendingWork
IPendingWork

Umožňuje IPendingWork odesílateli být upozorněn na item doručení.

workItem
Object

Objekt, který má být předán IPendingWork metodám.

Výjimky

queueName je odkaz s hodnotou null (Nothing v jazyce Visual Basic).

Modul runtime pracovního postupu není spuštěný.

-nebo-

Zadaný WorkflowQueue parametr neexistuje queueName .

-nebo-

Hodnota WorkflowQueue určená parametrem queueName není povolena.

Příklady

Následující příklad kódu ukazuje, jak použít EnqueueItem. Když dojde k WorkflowIdled události, zavolá se OnWorkflowIdled metoda definovaná v tomto příkladu. Určuje, který pracovní postup je nečinný pomocí WorkflowInstance vlastnosti a poté získá kolekci položek zařazených do fronty pro instanci pracovního postupu voláním GetWorkflowQueueData metody . Kód iteruje kolekci, aby zjistil, která aktivita čeká na událost, která pracovní postup neurčovala. Pak odešle výjimku do fronty pracovního postupu pomocí EnqueueItem metody spolu s názvem položky fronty událostí.

Tento příklad kódu je součástí ukázky Canceling a Workflow SDK ze souboru Program.cs. Další informace najdete v tématu Zrušení pracovního postupu.

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

Poznámky

Odešle do zadaného WorkflowQueueparametru item . Pokud chcete být upozorněni na doručení zprávy, můžete do služby implementovat IPendingWork a předat workItem objekt a IPendingWork .EnqueueItem Pokud takové oznámení nechcete, můžete předat nulový odkaz (Nothing v jazyce Visual Basic) pro pendingWork a workItem.

Při použití této metody s pracovním postupem stavového počítače může dojít k výjimce se zprávou"Fronta '{0}' není povolena. K tomu dochází v případě, že aktuální stav stavového počítače neví, jak zpracovat konkrétní událost. Například pokud některý jiný stav než aktuální stav obsahuje EventDrivenActivity , který obsahuje HandleExternalEventActivity , který je reprezentován frontou '{0}'.

Poznámka

Není zaručeno, že instance pracovního postupu bude přijímat zprávy v pořadí, v jakém byly odeslány. Pokud například přijetí zprávy v existující frontě (fronta A) způsobí, že pracovní postup vytvoří další frontu (frontu B), která pak naslouchá další zprávě odeslané po první zprávě, je možné, že druhá zpráva přijde jako první a nebude přijata, protože se fronta ještě nevytvořila. Pokud chcete tomuto problému zabránit, neměla by se druhá zpráva odesílat, dokud se neověří přítomnost druhé fronty (pomocí GetWorkflowQueueDatapříkazu . )

Platí pro

Viz také