Aracılığıyla paylaş


WorkflowPersistenceService.SaveWorkflowInstanceState Yöntem

Tanım

Türetilmiş bir sınıfta uygulandığında, iş akışı örneği durumunu bir veri deposuna kaydeder.

protected public:
 abstract void SaveWorkflowInstanceState(System::Workflow::ComponentModel::Activity ^ rootActivity, bool unlock);
protected internal abstract void SaveWorkflowInstanceState(System.Workflow.ComponentModel.Activity rootActivity, bool unlock);
abstract member SaveWorkflowInstanceState : System.Workflow.ComponentModel.Activity * bool -> unit
Protected Friend MustOverride Sub SaveWorkflowInstanceState (rootActivity As Activity, unlock As Boolean)

Parametreler

rootActivity
Activity

İş akışı örneğinin kök etkinliği.

unlock
Boolean

true iş akışı örneğinin kilitlenmemesi gerekiyorsa; false iş akışı örneğinin kilitlenmesi gerekiyorsa.

Örnekler

Aşağıdaki örnekte yönteminin bir uygulaması gösterilmektedir SaveWorkflowInstanceState . Bu örnek, Özel Kalıcılık Hizmeti örneğinden, FilePersistenceService.cs dosyasından alınıyor. Daha fazla bilgi için bkz. Özel Kalıcılık Hizmeti Örneği.

// Save the workflow instance state at the point of persistence with option of locking the instance state if it is shared
// across multiple runtimes or multiple phase instance updates
protected override void SaveWorkflowInstanceState(Activity rootActivity, bool unlock)
{
    // Save the workflow
    Guid contextGuid = (Guid)rootActivity.GetValue(Activity.ActivityContextGuidProperty);
    Console.WriteLine("Saving instance: {0}\n", contextGuid);
    SerializeToFile(
        WorkflowPersistenceService.GetDefaultSerializedForm(rootActivity), contextGuid);

    // See when the next timer (Delay activity) for this workflow will expire
    TimerEventSubscriptionCollection timers = (TimerEventSubscriptionCollection)rootActivity.GetValue(TimerEventSubscriptionCollection.TimerCollectionProperty);
    TimerEventSubscription subscription = timers.Peek();
    if (subscription != null)
    {
        // Set a system timer to automatically reload this workflow when its next timer expires
        TimerCallback callback = new TimerCallback(ReloadWorkflow);
        TimeSpan timeDifference = subscription.ExpiresAt - DateTime.UtcNow;
        System.Threading.Timer timer = new System.Threading.Timer(
            callback,
            subscription.WorkflowInstanceId,
            timeDifference < TimeSpan.Zero ? TimeSpan.Zero : timeDifference,
            new TimeSpan(-1));
    }
}
' Save the workflow instance state at the point of persistence with option of locking the instance state if it is shared
' across multiple runtimes or multiple phase instance updates
Protected Overrides Sub SaveWorkflowInstanceState(ByVal rootActivity As System.Workflow.ComponentModel.Activity, ByVal unlock As Boolean)
    Dim contextGuid As Guid = CType(rootActivity.GetValue(Activity.ActivityContextGuidProperty), Guid)
    Console.WriteLine("Saving instance: 0}" + vbLf, contextGuid)
    SerializeToFile( _
        WorkflowPersistenceService.GetDefaultSerializedForm(rootActivity), contextGuid)

    ' See when the next timer (Delay activity) for this workflow will expire
    Dim timers As TimerEventSubscriptionCollection = CType(rootActivity.GetValue(TimerEventSubscriptionCollection.TimerCollectionProperty), TimerEventSubscriptionCollection)
    Dim subscription As TimerEventSubscription = timers.Peek()
    If subscription IsNot Nothing Then
        ' Set a system timer to automatically reload this workflow when it's next timer expires
        Dim timeDifference As TimeSpan = subscription.ExpiresAt - DateTime.UtcNow
        Dim callback As TimerCallback = New TimerCallback(AddressOf ReloadWorkflow)
        Dim timer As New System.Threading.Timer( _
            callback, _
            subscription.WorkflowInstanceId, _
            CType(IIf(timeDifference < TimeSpan.Zero, TimeSpan.Zero, timeDifference), TimeSpan), _
            New TimeSpan(-1))
    End If
End Sub

Açıklamalar

içine seri hale rootActivityStreamgetirmek için aşırı yüklenmiş Save yöntemlerden birini çağırmanız gerekir. Daha sonra veri deponuza yazmadan önce ek olarak işlemeyi Stream seçebilirsiniz. Ancak, iş akışı çalışma zamanı altyapısı çağırdığında LoadWorkflowInstanceStatekök etkinliğin özdeş bir kopyasını geri yüklemeniz gerekir. İş akışı örneği durumunu veri deponuza kaydedemiyorsanız, uygun bir hata iletisiyle birlikte bir PersistenceException oluşturmalısınız.

İş akışı çalışma zamanı altyapısı, veri deposuna kaydedilen bir iş akışı örneği durumuna erişimi kısıtlamak için kilitleme semantiği sağlar. Bu, birden çok konakta çalışan ve aynı veri deposuna işaret eden kalıcılık hizmetleri tarafından erişilebilir. Kilitleme semantiği, iki farklı iş akışı çalışma zamanında çalışan kalıcılık hizmetlerinin aynı iş akışı örneğini aynı anda belleğe yüklemesini önlemek için tasarlanmıştır. Kalıcılık hizmetinizin desteklemek üzere tasarlandığı ortamın türüne bağlı olarak, bu işlevselliğin desteklenip desteklenmeyeceğini seçebilirsiniz. Çalışma zamanı kilitleme semantiğini desteklemeyi seçerseniz, bir kalıcılık hizmeti daha önce başka bir kalıcılık hizmeti tarafından kilitlenmiş bir iş akışı örneği durumunu kaydetmeye çalışırsa, bir WorkflowOwnershipExceptionoluşturmanız gerekir. ise unlocktrue, kaydettikten sonra iş akışı örneği durumuna erişimin kilidini açmanız gerekir.

LoadWorkflowInstanceState Guid, iş akışı örneğinin parametresini alır. Bu nedenle, bunu Guidkaydetmelisiniz. Bunu, iş akışı örneğini tamamlanmış kapsamlarının kaydedilmiş durumlarıyla ilişkilendirmek için de kullanabilirsiniz Guid . İş akışı örneği tamamlandığında bu tamamlanmış kapsamları gereksiz olarak işaretleyebilmeniz gerektiğinden bunu yapmalısınız.

İş akışı çalışma zamanı altyapısı, iş akışı örneği tamamlandığında veya sonlandırıldığında son zamanı çağırır SaveWorkflowInstanceState . Bu nedenle, veya Terminateddeğerine eşitse CompletedGetWorkflowStatus, iş akışı örneğini ve ilişkili tüm tamamlanmış kapsamlarını veri deponuzdan güvenle silebilirsiniz. Alternatif olarak, iş akışı örneğiyle ilişkili kayıtları silmenin WorkflowCompleted ne zaman güvenli olduğunu belirlemek için veya WorkflowTerminated olaylarına abone olabilirsiniz. Kayıtları veri deponuzdan gerçekten silip silmediğiniz, uygulamanıza bağlıdır.

Dayanıklı depo kullanan bir kalıcılık hizmeti uygularsanız, iş akışı çalışma zamanı altyapısının iç durumuyla tutarlılığı korumak için, dayanıklı deponuza gerçek yazma işlemini bir iş akışı işleme noktasına kadar ertelemek için iş akışı işlemi toplu işlemine katılmanız gerekir. Toplu işlere katılmak için özelliğine dayanıklı deponuzda WorkBatch bekleyen değişiklikleri temsil eden bir iş öğesi ekleyin ve kalıcılık hizmetinizde arabirimini uygulayın IPendingWork .

Şunlara uygulanır