WorkflowInstance.EnqueueItem Metoda
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
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 . )