WorkflowInstance.EnqueueItem 方法
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
同步公佈訊息至指定的工作流程佇列。
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
為 null 參考 (在 Visual Basic 中為 Nothing
)。
範例
下列程式碼範例將示範如何使用 EnqueueItem。 當 WorkflowIdled 事件發生時,會呼叫此範例中定義的 OnWorkflowIdled
方法。 它會使用 WorkflowInstance 屬性判斷閒置的工作流程,然後呼叫 GetWorkflowQueueData 方法取得工作流程執行個體之佇列項目的集合。 此程式碼會在集合上反覆查看,以判斷是哪個活動正在等候閒置工作流程的事件。 然後,它會使用 EnqueueItem 方法以及事件佇列項目的名稱,將例外狀況傳送到工作流程佇列中。
這個程式碼範例是 Program.cs 檔案中<取消工作流程 SDK>範例的一部分。 如需詳細資訊,請參閱 取消工作流程。
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
和 pendingWork
的 null 參考 (在 Visual Basic 中為 workItem
)。
搭配狀態機器工作流程使用此方法時,您可能會收到「佇列 ' {0} ' 未啟用」訊息的例外狀況。當狀態電腦的目前狀態不知道如何處理特定事件時,就會發生這種情況。 例如,當目前狀態以外的某種狀態包含 EventDrivenActivity,而且其中包含由佇列 '{0}' 所代表的 HandleExternalEventActivity 時。
注意
工作流程執行個體接收訊息的順序,不一定會與訊息的傳送順序相同。 例如,如果在現有佇列 (佇列 A) 中接收訊息導致工作流程建立另一個佇列 (佇列 B),後者接著接聽在第一個訊息後傳送的另一個訊息,第二個訊息可能會先到達,而且因為它的佇列尚未建立而無法被接收。 若要避免這個問題,應該先確認 (使用 GetWorkflowQueueData) 第二個佇列存在後,再傳送第二個訊息。