Bagikan melalui


WorkflowInstance.EnqueueItem Metode

Definisi

Memposting pesan ke antrean alur kerja yang ditentukan secara sinkron.

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)

Parameter

queueName
IComparable

Nama WorkflowQueue.

item
Object

Objek yang akan diantrekan.

pendingWork
IPendingWork

Yang IPendingWork memungkinkan pengirim diberi tahu ketika item dikirimkan.

workItem
Object

Objek yang akan diteruskan ke IPendingWork metode .

Pengecualian

queueName adalah referensi null (Nothing dalam Visual Basic).

Mesin runtime alur kerja tidak berjalan.

-atau-

Yang WorkflowQueue ditentukan oleh queueName tidak ada.

-atau-

Yang WorkflowQueue ditentukan oleh queueName tidak diaktifkan.

Contoh

Contoh kode berikut menunjukkan cara menggunakan EnqueueItem. WorkflowIdled Ketika peristiwa terjadi, metode yang OnWorkflowIdled ditentukan dalam contoh ini dipanggil. Ini menentukan alur kerja mana yang diam menggunakan WorkflowInstance properti dan kemudian mendapatkan kumpulan item antrean untuk instans alur kerja dengan memanggil GetWorkflowQueueData metode . Kode berulang di atas koleksi untuk menentukan aktivitas mana yang menunggu peristiwa yang menganggur alur kerja. Kemudian mengirimkan pengecualian ke antrean alur kerja menggunakan EnqueueItem metode bersama dengan nama item antrean peristiwa.

Contoh kode ini adalah bagian dari membatalkan sampel SDK Alur Kerja dari file Program.cs. Untuk informasi selengkapnya, lihat Membatalkan Alur Kerja.

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

Keterangan

Mengirim ke item yang ditentukan WorkflowQueue. Jika Anda ingin diberi tahu saat pesan dikirimkan, Anda dapat menerapkan IPendingWork dalam layanan Anda dan meneruskan workItem dan IPendingWork objek ke EnqueueItem. Jika Anda tidak menginginkan pemberitahuan tersebut, Anda dapat meneruskan referensi null (Nothing di Visual Basic) untuk pendingWork dan workItem.

Saat menggunakan metode ini dengan alur kerja mesin status, Anda mungkin mendapatkan pengecualian dengan pesan "Antrean '{0}' tidak diaktifkan." Ini terjadi ketika status mesin status saat ini tidak tahu cara menangani peristiwa tertentu. Misalnya, ketika beberapa status selain status saat ini berisi EventDrivenActivity yang berisi HandleExternalEventActivity yang diwakili oleh antrean '{0}'.

Catatan

Pesan tidak dijamin diterima oleh instans alur kerja dalam urutan pengirimannya. Misalnya, jika menerima pesan dalam antrean yang ada (Antrean A) menyebabkan alur kerja membuat antrean lain (Antrean B), yang kemudian mendengarkan pesan lain yang dikirim setelah pesan pertama, ada kemungkinan pesan kedua akan tiba terlebih dahulu, dan tidak akan diterima karena antreannya belum dibuat. Untuk mencegah masalah ini, pesan kedua tidak boleh dikirim sampai adanya antrean kedua diverifikasi (menggunakan GetWorkflowQueueData.)

Berlaku untuk

Lihat juga