Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bir iş akışının içinde etkinlikler iptal edilebilir; örneğin, bir etkinlik, Parallel eksik dalları CompletionCondition olarak değerlendirdiğinde true ile veya iş akışının dışından, konak Cancel çağırırsa iptal edilebilir. İptal işleme sağlamak için, iş akışı yazarları CancellationScope etkinliğini, CompensableActivity etkinliğini kullanabilir veya iptal mantığı sağlayan özel etkinlikler oluşturabilir. Bu konu, iş akışlarında iptale genel bir bakış sağlar.
İptal, Ücretlendirme ve İşlemler
İşlemler, uygulamanıza işlem işleminin herhangi bir bölümünde hata oluşması durumunda işlem içinde yürütülen tüm değişiklikleri durdurma (geri alma) olanağı verir. Ancak, iptal edilmesi veya geri alınması gerekebilecek tüm çalışmalar, uzun süre çalışan çalışma veya işlem kaynakları içermeyen çalışma gibi işlemler için uygun değildir. Telafi, iş akışında sonraki bir hata meydana gelirse, önceden tamamlanmış işlemsel olmayan çalışmayı iptal etmek için bir model sağlar. İptal, iş akışı ve etkinlik yazarlarının tamamlanmamış işlem dışı işleri işlemesi için bir model sağlar. Bir aktivite yürütmesini tamamlamadıysa ve iptal edilirse, geçerliyse iptal mantığı çalıştırılır.
Not
İşlemler ve ücretlendirme hakkında daha fazla bilgi için bkz . İşlemler ve Ücretlendirme.
CancellationScope'u Kullanma
CancellationScope etkinliği iki bölüm içerebilir: çocuk etkinlikleri için Body ve CancellationHandler. Body, etkinliğin mantığını oluşturan etkinliklerin yerleştirildiği yerdir ve CancellationHandler etkinliğin iptal mantığını sağlayan etkinliklerin yerleştirildiği yerdir. Bir etkinlik ancak tamamlanmadıysa iptal edilebilir. Etkinlik söz konusu olduğunda CancellationScope tamamlanma, içindeki Bodyetkinliklerin tamamlanmasını ifade eder. Eğer bir iptal isteği zamanlandıysa ve Body içindeki etkinlikler tamamlanmamışsa, CancellationScopeCanceled olarak işaretlenir ve CancellationHandler etkinlikler yürütülür.
Bir İş Akışını Sunucudan İptal Etme
Bir konak, iş akışını barındıran Cancel örneğinin WorkflowApplication yöntemini çağırarak bir iş akışını iptal edebilir. Aşağıdaki örnekte, içeren CancellationScopebir iş akışı oluşturulur. İş akışı çağrılır ve ardından konak Cancel'yi arar. İş akışının ana yürütmesi durdurulur, CancellationHandlerCancellationScope öğesi çağrılır ve iş akışı Canceled durumuyla tamamlanır.
Activity wf = new CancellationScope
{
Body = new Sequence
{
Activities =
{
new WriteLine
{
Text = "Starting the workflow."
},
new Delay
{
Duration = TimeSpan.FromSeconds(5)
},
new WriteLine
{
Text = "Ending the workflow."
}
}
},
CancellationHandler = new WriteLine
{
Text = "CancellationHandler invoked."
}
};
// Create a WorkflowApplication instance.
WorkflowApplication wfApp = new WorkflowApplication(wf);
// Subscribe to any desired workflow lifecycle events.
wfApp.Completed = delegate (WorkflowApplicationCompletedEventArgs e)
{
if (e.CompletionState == ActivityInstanceState.Faulted)
{
Console.WriteLine($"Workflow {e.InstanceId} Terminated.");
Console.WriteLine($"Exception: {e.TerminationException.GetType().FullName}\n{e.TerminationException.Message}");
}
else if (e.CompletionState == ActivityInstanceState.Canceled)
{
Console.WriteLine($"Workflow {e.InstanceId} Canceled.");
}
else
{
Console.WriteLine($"Workflow {e.InstanceId} Completed.");
}
};
// Run the workflow.
wfApp.Run();
Thread.Sleep(TimeSpan.FromSeconds(1));
wfApp.Cancel();
Bu iş akışı çağrıldığında konsolda aşağıdaki çıkış görüntülenir.
İş akışı başlatılıyor.
CancellationHandler çağrıldı.İş akışı b30ebb30-df46-4d90-a211-e31c38d8db3c İptal Edildi.
Not
Etkinlik CancellationScope iptal edildiğinde ve CancellationHandler çağrıldığında, uygun iptal mantığını sağlamak için iptal edilen etkinliğin iptal edilmeden önce kaydettiği ilerlemeyi belirlemek iş akışı yazarının sorumluluğundadır. , CancellationHandler iptal edilen etkinliğin ilerleme durumu hakkında herhangi bir bilgi sağlamaz.
İş akışının kökünden işlenmemiş bir özel durum yukarıya doğru yayılırsa ve OnUnhandledException işleyici Cancel döndürürse, bir iş akışı konaktan da iptal edilebilir. Bu örnekte iş akışı başlar ve sonra bir ApplicationException oluşturur. Bu özel durum iş akışı tarafından işlenmemiştir ve bu nedenle OnUnhandledException işleyici çağrılır. İşleyici, çalışma zamanına iş akışını iptal etmesi talimatını verir ve şu anda yürütülen CancellationHandler etkinliğinin CancellationScope çağrılır.
Activity wf = new CancellationScope
{
Body = new Sequence
{
Activities =
{
new WriteLine
{
Text = "Starting the workflow."
},
new Throw
{
Exception = new InArgument<Exception>((env) =>
new ApplicationException("An ApplicationException was thrown."))
},
new WriteLine
{
Text = "Ending the workflow."
}
}
},
CancellationHandler = new WriteLine
{
Text = "CancellationHandler invoked."
}
};
// Create a WorkflowApplication instance.
WorkflowApplication wfApp = new WorkflowApplication(wf);
// Subscribe to any desired workflow lifecycle events.
wfApp.OnUnhandledException = delegate (WorkflowApplicationUnhandledExceptionEventArgs e)
{
// Display the unhandled exception.
Console.WriteLine($"OnUnhandledException in Workflow {e.InstanceId}\n{e.UnhandledException.Message}");
// Instruct the runtime to cancel the workflow.
return UnhandledExceptionAction.Cancel;
};
wfApp.Completed = delegate (WorkflowApplicationCompletedEventArgs e)
{
if (e.CompletionState == ActivityInstanceState.Faulted)
{
Console.WriteLine($"Workflow {e.InstanceId} Terminated.");
Console.WriteLine($"Exception: {e.TerminationException.GetType().FullName}\n{e.TerminationException.Message}");
}
else if (e.CompletionState == ActivityInstanceState.Canceled)
{
Console.WriteLine($"Workflow {e.InstanceId} Canceled.");
}
else
{
Console.WriteLine($"Workflow {e.InstanceId} Completed.");
}
};
// Run the workflow.
wfApp.Run();
Bu iş akışı çağrıldığında konsolda aşağıdaki çıkış görüntülenir.
İş akışı başlatılıyor.
6bb2d5d6-f49a-4c6d-a988-478afb86dbe9 iş akışında OnUnhandledExceptionbir 'ApplicationException' hatası oluşturuldu.CancellationHandler çağrıldı.İş akışı 6bb2d5d6-f49a-4c6d-a988-478afb86dbe9 iptal edildi.
bir İş Akışının İçinden Etkinliği İptal Etme
Bir etkinlik, ebeveyni tarafından da iptal edilebilir. Örneğin, bir Parallel etkinliğin birden fazla yürütme dalı varsa ve CompletionConditiontrue olarak değerlendirildiğinde, tamamlanmamış dalları iptal edilir. Bu örnekte iki dalı olan bir Parallel etkinlik oluşturulur.
CompletionCondition, true olarak ayarlanır, böylece dallarından herhangi biri tamamlandığında Parallel tamamlanır. Bu örnekte dal 2 tamamlanır ve bu nedenle dal 1 iptal edilir.
Activity wf = new Parallel
{
CompletionCondition = true,
Branches =
{
new CancellationScope
{
Body = new Sequence
{
Activities =
{
new WriteLine
{
Text = "Branch 1 starting."
},
new Delay
{
Duration = TimeSpan.FromSeconds(2)
},
new WriteLine
{
Text = "Branch 1 complete."
}
}
},
CancellationHandler = new WriteLine
{
Text = "Branch 1 canceled."
}
},
new WriteLine
{
Text = "Branch 2 complete."
}
}
};
// Create a WorkflowApplication instance.
WorkflowApplication wfApp = new WorkflowApplication(wf);
wfApp.Completed = delegate (WorkflowApplicationCompletedEventArgs e)
{
if (e.CompletionState == ActivityInstanceState.Faulted)
{
Console.WriteLine($"Workflow {e.InstanceId} Terminated.");
Console.WriteLine($"Exception: {e.TerminationException.GetType().FullName}\n{e.TerminationException.Message}");
}
else if (e.CompletionState == ActivityInstanceState.Canceled)
{
Console.WriteLine($"Workflow {e.InstanceId} Canceled.");
}
else
{
Console.WriteLine($"Workflow {e.InstanceId} Completed.");
}
};
// Run the workflow.
wfApp.Run();
Bu iş akışı çağrıldığında konsolda aşağıdaki çıkış görüntülenir.
Şube 1 başlıyor.
Dal 2 tamamlandı.Dal 1 iptal edildi.İş akışı e0685e24-18ef-4a47-acf3-5c638732f3be Tamamlandı. Bir özel durum etkinliğin kökünden geçerse ancak iş akışında daha yüksek bir düzeyde işlenirse etkinlikler de iptal edilir. Bu örnekte, iş akışının ana mantığı bir Sequence etkinlik içerir.
Sequence, Body etkinliği tarafından içeren bir CancellationScope etkinliğin TryCatch olarak belirtilir.
Sequence gövdesinden bir istisna atılır, üst TryCatch etkinlik tarafından işlenir ve Sequence iptal edilir.
Activity wf = new TryCatch
{
Try = new CancellationScope
{
Body = new Sequence
{
Activities =
{
new WriteLine
{
Text = "Sequence starting."
},
new Throw
{
Exception = new InArgument<Exception>((env) =>
new ApplicationException("An ApplicationException was thrown."))
},
new WriteLine
{
Text = "Sequence complete."
}
}
},
CancellationHandler = new WriteLine
{
Text = "Sequence canceled."
}
},
Catches =
{
new Catch<ApplicationException>
{
Action = new ActivityAction<ApplicationException>
{
Handler = new WriteLine
{
Text = "Exception caught."
}
}
}
}
};
// Create a WorkflowApplication instance.
WorkflowApplication wfApp = new WorkflowApplication(wf);
wfApp.Completed = delegate (WorkflowApplicationCompletedEventArgs e)
{
if (e.CompletionState == ActivityInstanceState.Faulted)
{
Console.WriteLine($"Workflow {e.InstanceId} Terminated.");
Console.WriteLine($"Exception: {e.TerminationException.GetType().FullName}\n{e.TerminationException.Message}");
}
else if (e.CompletionState == ActivityInstanceState.Canceled)
{
Console.WriteLine($"Workflow {e.InstanceId} Canceled.");
}
else
{
Console.WriteLine($"Workflow {e.InstanceId} Completed.");
}
};
// Run the workflow.
wfApp.Run();
Bu iş akışı çağrıldığında konsolda aşağıdaki çıkış görüntülenir.
Sıra başlatılıyor.
Dizi iptal edildi.İstisna yakalandı.İş akışı e3c18939-121e-4c43-af1c-ba1ce977ce55 tamamlandı.
CancellationHandler'dan Özel Durumlar Oluşturma
CancellationHandler nesnesinin CancellationScope öğesinden kaynaklanan tüm özel durumlar, iş akışı için ölümcüldür. Eğer CancellationHandler'dan kaçan özel durum olasılığı varsa, bu özel durumları yakalamak ve işlemek için TryCatch içinde bir CancellationHandler kullanın.
CompensableActivity kullanımıyla iptal etme
CancellationScope etkinliğinde olduğu gibi, CompensableActivity öğesinin de bir CancellationHandler vardır. CompensableActivity iptal edilirse, CancellationHandler içindeki tüm etkinlikler çağrılır. Bu, kısmen tamamlanmış telafi edilebilir çalışmayı geri almak için yararlı olabilir. CompensableActivity'yi tazminat ve iptal için nasıl kullanacağınız hakkında bilgi için tazminat bölümüne bakın.
Özel Etkinlikler kullanarak iptal etme
Özel etkinlik yazarları, özel etkinliklerine çeşitli yollarla iptal mantığı uygulayabilir. 'den Activity türetilen özel etkinlikler, etkinliğin gövdesine iptal mantığı içeren bir veya başka bir CancellationScope özel etkinlik yerleştirerek iptal mantığını uygulayabilir. AsyncCodeActivity ve NativeActivity ile türetilen aktiviteler kendi Cancel yöntemlerini geçersiz kılarak iptal mantığını burada sağlayabilir. CodeActivity türetilmiş etkinlikler, iptal için herhangi bir imkân sunmaz çünkü çalışma zamanı Execute yöntemini çağırdığında tüm işler tek bir yürütme patlamasında gerçekleştirilir. Yürütme metodu henüz çağrılmadıysa ve CodeActivity tabanlı bir etkinlik iptal edilirse, etkinlik Canceled durumu ile kapanır ve Execute metodu çağrılmaz.
NativeActivity kullanarak iptal etme
NativeActivity türetilmiş etkinlikler, özel iptal mantığı sağlamak için Cancel yöntemini geçersiz kılabilir. Bu yöntem geçersiz kılınmazsa, varsayılan iş akışı iptal mantığı uygulanır. Varsayılan iptal, NativeActivity'nin Cancel yöntemini geçersiz kılmadığı veya Cancel yönteminin temel NativeActivityCancel yöntemini çağırdığı durumlarda gerçekleşen işlemdir. Bir etkinlik iptal edildiğinde, çalışma ortamı etkinliği iptal edilecek şekilde işaretler ve belirli temizleme görevlerini otomatik olarak gerçekleştirir. Etkinlikte yalnızca tamamlanmamış yer işaretleri varsa, yer işaretleri kaldırılır ve etkinlik Canceled olarak işaretlenir. İptal edilen etkinlikle ilişkili tüm çocuk etkinlikleri de iptal edilecektir. Ek çocuk etkinliklerini zamanlamaya yönelik tüm girişimler, girişimin yoksayılmasıyla sonuçlanır ve etkinlik Canceled olarak işaretlenir. Eğer Canceled veya Faulted durumunda kalan herhangi bir alt etkinlik tamamlanırsa, bu etkinlik Canceled olarak işaretlenir. Bir iptal talebinin göz ardı edilebileceğini unutmayın. Etkinliğin bekleyen yer işareti veya yürütülen alt etkinliği yoksa ve iptal için işaretlenmesinin ardından ek iş öğesi zamanlamıyorsa, başarıyla tamamlanır. Bu varsayılan iptal birçok senaryo için yeterlidir, ancak ek iptal mantığı gerekiyorsa yerleşik iptal etkinlikleri veya özel etkinlikler kullanılabilir.
Aşağıdaki örnekte, Cancel tabanlı bir NativeActivity özel ParallelForEach etkinliğin geçersiz kılma işlemi tanımlanmıştır. Etkinlik iptal edildiğinde, bu üstün tanımlama etkinliğin iptal edilme mantığını işler. Bu örnek, Genel Olmayan ParallelForEach örneğinin bir parçasıdır.
protected override void Cancel(NativeActivityContext context)
{
// If we do not have a completion condition then we can just
// use default logic.
if (this.CompletionCondition == null)
{
base.Cancel(context);
}
else
{
context.CancelChildren();
}
}
NativeActivity türetilmiş etkinlikler, IsCancellationRequested özelliğini inceleyerek iptal istenip istenmediğini belirleyebilir ve MarkCanceled metodunu çağırarak iptal edildi olarak kendilerini işaretleyebilir. Çağırma MarkCanceled işlemi etkinliği hemen tamamlamaz. Her zamanki gibi, çalışma zamanı daha fazla bekleyen çalışma olmadığında etkinliği tamamlar, ancak eğer MarkCanceled çağrılırsa son durum Canceled yerine Closed olur.
AsyncCodeActivity kullanarak iptal etme
AsyncCodeActivity tabanlı etkinlikler, Cancel yöntemini geçersiz kılarak özel bir iptal mantığı sağlayabilir. Bu yöntem geçersiz kılınmazsa, etkinlik iptal edilirse iptal işlemi gerçekleştirilmez. Aşağıdaki örnekte, Cancel tabanlı bir AsyncCodeActivity özel ExecutePowerShell etkinliğin geçersiz kılma işlemi tanımlanmıştır. Etkinlik iptal edildiğinde istenen iptal davranışını gerçekleştirir.
// Called by the runtime to cancel the execution of this asynchronous activity.
protected override void Cancel(AsyncCodeActivityContext context)
{
Pipeline pipeline = context.UserState as Pipeline;
if (pipeline != null)
{
pipeline.Stop();
DisposePipeline(pipeline);
}
base.Cancel(context);
}
AsyncCodeActivity türetilmiş etkinlikler, IsCancellationRequested özelliğini inceleyerek iptal istenip istenmediğini belirleyebilir ve MarkCanceled metodunu çağırarak iptal edildi olarak kendilerini işaretleyebilir.