Aracılığıyla paylaş


Windows Workflow Foundation Özel Durumları

İş akışları, bir iş akışının yürütülmesi sırasında oluşturulan özel durumları işlemek için TryCatch etkinliğini kullanabilir. Bu özel durumlar işlenebilir veya Rethrow etkinliği kullanılarak yeniden oluşturulabilir. Finally bölümündeki etkinlikler, Try bölümü veya Catches bölümü tamamlandığında yürütülür. bir WorkflowApplication örneği tarafından barındırılan iş akışları, TryCatch etkinliği tarafından işlenmeyen özel durumları işlemek için OnUnhandledException olay işleyicisini de kullanabilir.

Özel Durumların Nedenleri

Bir iş akışında, özel durumlar aşağıdaki yollarla oluşturulabilir:

  • TransactionScopeişlemlerinde zaman aşımı.

  • Throw etkinliği kullanılarak iş akışı tarafından oluşan açık bir özel durum.

  • Bir etkinlikten oluşan bir .NET Framework 4.6.1 özel durumu.

  • İş akışında kullanılan kitaplıklar, bileşenler veya hizmetler gibi dış koddan oluşan özel durum.

Özel Durumları İşleme

Bir etkinlik tarafından özel durum oluşturulursa ve işlenmemişse, varsayılan davranış iş akışı örneğini sonlandırmaktır. Özel bir OnUnhandledException işleyicisi varsa, bu varsayılan davranışı geçersiz kılabilir. Bu işleyici, iş akışı ana bilgisayar yazarına özel günlük kaydı, iş akışını durdurma, iş akışını iptal etme veya iş akışını sonlandırma gibi uygun işlemeyi sağlama fırsatı verir. bir iş akışı işlenmeyen bir özel durum oluşturursa, OnUnhandledException işleyicisi çağrılır. İş akışının nihai sonucunu belirleyen OnUnhandledException döndürülen üç olası eylem vardır.

  • İptal - İptal edilen iş akışı örneği, dal yürütmesinin düzgün bir şekilde çıkışıdır. İptal davranışını modelleyebilirsiniz (örneğin, bir CancellationScope etkinliği kullanarak). İptal işlemi tamamlandığında Tamamlandı işleyicisi çağrılır. İptal edilen iş akışı İptal Edildi durumunda.

  • Terminate - Sonlandırılan bir iş akışı örneği sürdürülemez veya yeniden başlatılamaz. Bu, sonlandırıldığı neden olarak bir özel durum sağlayabileceğiniz Tamamlandı olayını tetikler. Sonlandırma işlemi tamamlandığında Sonlandırılan işleyici çağrılır. Sonlandırılan iş akışı Hatalı durumda.

  • Abort - Durdurulan iş akışı örnekleri yalnızca kalıcı olacak şekilde yapılandırılmışsa sürdürülebilir. Kalıcılık olmadan bir iş akışı sürdürülemez. Bir iş akışı durdurulduysa, son kalıcılık noktasından bu yana yapılan tüm çalışmalar (bellekte) kaybolur. Durdurulan bir iş akışı için durdurulan işleyici, iptal işleminin tamamlanmasının nedeni olarak özel durum kullanılarak çağrılır. Ancak İptal Edildi ve Sonlandırıldı'nın aksine, Tamamlandı işleyicisi çağrılmıyor. Durdurulan iş akışı Durduruldu durumunda.

Aşağıdaki örnek, özel durum oluşturan bir iş akışını çağırır. Özel durum iş akışı tarafından işlenmemiştir ve OnUnhandledException işleyicisi çağrılır. özel durum hakkında bilgi sağlamak için WorkflowApplicationUnhandledExceptionEventArgs incelenir ve iş akışı sonlandırılır.

Activity wf = new Sequence
{
    Activities =
     {
         new WriteLine
         {
             Text = "Starting the workflow."
         },
         new Throw
        {
            Exception = new InArgument<Exception>((env) =>
                new ApplicationException("Something unexpected happened."))
        },
        new WriteLine
         {
             Text = "Ending the workflow."
         }
     }
};

WorkflowApplication wfApp = new WorkflowApplication(wf);

wfApp.OnUnhandledException = delegate (WorkflowApplicationUnhandledExceptionEventArgs e)
{
    // Display the unhandled exception.
    Console.WriteLine($"OnUnhandledException in Workflow {e.InstanceId}\n{e.UnhandledException.Message}");

    Console.WriteLine($"ExceptionSource: {e.ExceptionSource.DisplayName} - {e.ExceptionSourceInstanceId}");

    // Instruct the runtime to terminate the workflow.
    return UnhandledExceptionAction.Terminate;

    // Other choices are UnhandledExceptionAction.Abort and
    // UnhandledExceptionAction.Cancel
};

wfApp.Run();

TryCatch Etkinliği ile Özel Durumları İşleme

bir iş akışı içindeki özel durumları işleme, TryCatch etkinliğiyle gerçekleştirilir. TryCatch etkinliği, her biri belirli bir Exception türüyle ilişkilendirilmiş Catch etkinliklerden oluşan Catches bir koleksiyona sahiptir. bir TryCatch etkinliğinin Try bölümünde yer alan bir etkinlik tarafından oluşan özel durum, Catches koleksiyonundaki bir Catch<TException> etkinliğinin özel durumuyla eşleşiyorsa, özel durum işlenir. Özel durum açıkça yeniden oluşturulursa veya yeni bir özel durum oluşturulursa, bu özel durum üst etkinliğe geçer. Aşağıdaki kod örneğinde, Try bölümünde bir Throw etkinliği tarafından atılan bir ApplicationException işleyen TryCatch etkinliği gösterilmektedir. Özel durumun iletisi konsola Catch<TException> etkinliği tarafından yazılır ve ardından Finally bölümünde konsola bir ileti yazılır.

DelegateInArgument<ApplicationException> ex = new DelegateInArgument<ApplicationException>()
{
    Name = "ex"
};

Activity wf = new TryCatch
{
    Try = new Throw()
    {
        Exception = new InArgument<Exception>((env) => new ApplicationException("An ApplicationException was thrown."))
    },
    Catches =
    {
        new Catch<ApplicationException>
        {
            Action = new ActivityAction<ApplicationException>
            {
                Argument = ex,
                Handler = new WriteLine()
                {
                    Text = new InArgument<string>((env) => ex.Get(env).Message)
                }
            }
        }
    },
    Finally = new WriteLine()
    {
        Text = "Executing in Finally."
    }
};

Finally bölümündeki etkinlikler, Try bölümü veya Catches bölümü başarıyla tamamlandığında yürütülür. Try bölümü, özel durum oluşturmazsa başarıyla tamamlar ve Catches bölümü hiçbir özel durum oluşturmaz veya yeniden oluşturulursa başarıyla tamamlar. Bir TryCatchTry bölümünde bir özel durum oluşturulursa ve Catches bölümündeki bir Catch<TException> tarafından işlenmezse veya Catchesyeniden oluşturulursa, Finally etkinlikler aşağıdakilerden biri gerçekleşmediği sürece yürütülmeyecektir.

Özel Durum İşleme ve Telafi karşılaştırması

Özel durum işleme ile dengeleme arasındaki fark, bir etkinliğin yürütülmesi sırasında özel durum işlemenin gerçekleşmesidir. Dengeleme, bir etkinlik başarıyla tamamlandıktan sonra gerçekleşir. Özel durum işleme, etkinlik özel durumu oluşturduktan sonra temizleme fırsatı sunarken, dengeleme daha önce tamamlanan bir etkinliğin başarıyla tamamlanan çalışmasının geri alınabileceği bir mekanizma sağlar. Daha fazla bilgi için bkz. Dengeleme.

Ayrıca bkz.