WorkflowInstance.EnqueueItem Metode
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
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.)