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
) です。
ワークフロー ランタイム エンジンが実行されていません。
- または -
WorkflowQueue で指定された queueName
が存在しません。
- または -
WorkflowQueue で指定された queueName
が無効になっています。
例
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
) を渡します。
ステート マシン ワークフローでこのメソッドを使用すると、"Queue '{0}' is not enabled" というメッセージで例外が発生する可能性があります。これは、ステート マシンの現在の状態が特定のイベントの処理方法を認識していない場合に発生します。 たとえば、現在の状態以外の状態に、キュー '{0}' で表現される EventDrivenActivity を含む HandleExternalEventActivity が含まれている場合です。
注意
メッセージは、送信された順序でワークフロー インスタンスで受信されるとは限りません。 たとえば、既存のキュー (キュー A) でメッセージを受信し、ワークフローによって別のキュー (キュー B) が生成され、最初のメッセージの後に送信された別のメッセージをリッスンする場合は、2 番目のメッセージが最初に届き、キューがまだ作成されていないために受信されない場合があります。 この問題を回避するには、GetWorkflowQueueData を使用して、2 番目のキューが存在することを確認するまで、2 番目のメッセージを送信しないようにする必要があります。
適用対象
こちらもご覧ください
.NET