次の方法で共有


WorkflowInstance.EnqueueItem メソッド

定義

指定したワークフロー キューへのメッセージの同期ポストを行います。

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

注釈

指定した itemWorkflowQueue を送信します。 メッセージが配信されたときに通知を受けるには、サービスに IPendingWork を実装して、workItem および IPendingWork オブジェクトを EnqueueItem に渡します。 そのような通知が不要な場合は、NothingpendingWork に null 参照 (Visual Basic の場合は workItem) を渡します。

ステート マシン ワークフローでこのメソッドを使用すると、"Queue '{0}' is not enabled" というメッセージで例外が発生する可能性があります。これは、ステート マシンの現在の状態が特定のイベントの処理方法を認識していない場合に発生します。 たとえば、現在の状態以外の状態に、キュー '{0}' で表現される EventDrivenActivity を含む HandleExternalEventActivity が含まれている場合です。

注意

メッセージは、送信された順序でワークフロー インスタンスで受信されるとは限りません。 たとえば、既存のキュー (キュー A) でメッセージを受信し、ワークフローによって別のキュー (キュー B) が生成され、最初のメッセージの後に送信された別のメッセージをリッスンする場合は、2 番目のメッセージが最初に届き、キューがまだ作成されていないために受信されない場合があります。 この問題を回避するには、GetWorkflowQueueData を使用して、2 番目のキューが存在することを確認するまで、2 番目のメッセージを送信しないようにする必要があります。

適用対象

こちらもご覧ください