WorkflowInstance.EnqueueItem Yöntem
Tanım
Önemli
Bazı bilgiler ürünün ön sürümüyle ilgilidir ve sürüm öncesinde önemli değişiklikler yapılmış olabilir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.
Belirtilen iş akışı kuyruğuna zaman uyumlu olarak bir ileti gönderir.
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)
Parametreler
- queueName
- IComparable
WorkflowQueue öğesinin adı.
- item
- Object
Sıraya almak için nesne.
- pendingWork
- IPendingWork
IPendingWork Teslim edildiğinde item
gönderenin bilgilendirilmesini sağlayan bir.
- workItem
- Object
Yöntemlere geçirilecek IPendingWork bir nesne.
Özel durumlar
queueName
bir null başvurudur (Nothing
Visual Basic'te).
İş akışı çalışma zamanı altyapısı çalışmıyor.
-veya-
tarafından WorkflowQueue belirtilen queueName
yok.
-veya-
tarafından WorkflowQueue belirtilen queueName
etkin değil.
Örnekler
Aşağıdaki kod örneğinde nasıl kullanılacağı EnqueueItemgösterilmektedir. Olay gerçekleştiğinde WorkflowIdled , OnWorkflowIdled
bu örnekte tanımlanan yöntem çağrılır. özelliğini kullanarak hangi iş akışının WorkflowInstance boşta olduğunu belirler ve ardından yöntemini çağırarak GetWorkflowQueueData iş akışı örneği için kuyruğa alınan öğelerden oluşan bir koleksiyon alır. Kod, iş akışının boşta olduğu olayı bekleyen etkinliği belirlemek için koleksiyon üzerinde yinelenir. Ardından, olay kuyruğu öğesinin adıyla birlikte yöntemini kullanarak EnqueueItem iş akışı kuyruğuna bir özel durum gönderir.
Bu kod örneği, Program.cs dosyasından İş Akışı SDK'sını İptal Etme örneğinin bir parçasıdır. Daha fazla bilgi için bkz. İş Akışını İptal Etme.
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
Açıklamalar
öğesini item
belirtilen WorkflowQueueöğesine gönderir. İleti teslim edildiğinde bildirim almak istiyorsanız, hizmetinize uygulayabilir IPendingWork ve öğesine bir workItem
ve nesnesi IPendingWorkEnqueueItemgeçirebilirsiniz. Böyle bir bildirim istemiyorsanız ve için pendingWork
workItem
null başvuru (Nothing
Visual Basic'te) geçirebilirsiniz.
Bu yöntemi bir durum makinesi iş akışıyla kullanırken, "'' kuyruğu{0} etkinleştirilmedi" iletisiyle bir özel durum alabilirsiniz. Durum makinesinin geçerli durumu belirli bir olayı nasıl işleyeceklerini bilmediğinde bu durum ortaya çıkar. Örneğin, geçerli durumdan başka bir durum ''{0} kuyruğu tarafından temsil edilen öğesini içeren değerini içerdiğinde.EventDrivenActivityHandleExternalEventActivity
Not
İletilerin iş akışı örneği tarafından gönderilme sırasına göre alınması garanti değildir. Örneğin, var olan bir kuyrukta (Kuyruk A) bir iletinin alınması, bir iş akışının başka bir kuyruk (Kuyruk B) oluşturmasına neden oluyorsa ve bu da ilk iletiden sonra gönderilen başka bir iletiyi dinlerse, ilk iletinin gelmesi ve kuyruğunun henüz oluşturulmaması nedeniyle alınmaması mümkündür. Bu sorunu önlemek için ikinci kuyruğun varlığı doğrulanana kadar (kullanılarak GetWorkflowQueueData) ikinci ileti gönderilmemelidir.