Bagikan melalui


WorkflowPersistenceService.SaveWorkflowInstanceState Metode

Definisi

Saat diimplementasikan di kelas turunan, menyimpan status instans alur kerja ke penyimpanan data.

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)

Parameter

rootActivity
Activity

Aktivitas akar instans alur kerja.

unlock
Boolean

true jika instans alur kerja tidak boleh dikunci; false jika instans alur kerja harus dikunci.

Contoh

Contoh berikut menunjukkan implementasi SaveWorkflowInstanceState metode . Contoh ini berasal dari sampel Layanan Persistensi Kustom, dari file FilePersistenceService.cs. Untuk informasi selengkapnya, lihat Sampel Layanan Persistensi Kustom.

// 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

Keterangan

Anda harus memanggil salah satu metode yang kelebihan beban Save untuk diserialisasikan rootActivity ke dalam Stream. Anda kemudian dapat memilih untuk memproses Stream selain sebelum menulisnya ke penyimpanan data Anda. Namun, ketika mesin runtime alur kerja memanggil LoadWorkflowInstanceState, Anda harus memulihkan salinan aktivitas akar yang identik. Jika Anda tidak dapat menyimpan status instans alur kerja ke penyimpanan data, Anda harus melempar PersistenceException dengan pesan kesalahan yang sesuai.

Mesin runtime alur kerja menyediakan semantik penguncian untuk membatasi akses ke status instans alur kerja yang disimpan di penyimpanan data. Ini dapat diakses oleh layanan persistensi yang berjalan di beberapa host dan menunjuk ke penyimpanan data yang sama. Semantik penguncian dirancang untuk mencegah layanan persistensi yang berjalan dalam dua runtime alur kerja yang berbeda dari memuat instans alur kerja yang sama ke dalam memori secara bersamaan. Bergantung pada jenis lingkungan yang dirancang untuk mendukung layanan persistensi Anda, Anda dapat memilih apakah akan mendukung fungsionalitas ini. Jika Anda memilih untuk mendukung semantik penguncian runtime, maka, jika layanan persistensi mencoba menyimpan status instans alur kerja yang sebelumnya telah dikunci oleh layanan persistensi lain, Anda harus melempar WorkflowOwnershipException. Jika unlock adalah true, Anda harus membuka kunci akses ke status instans alur kerja setelah menyimpannya.

LoadWorkflowInstanceStateGuid mengambil instans alur kerja sebagai parameter. Oleh karena itu, Anda harus menyimpan ini Guid. Anda juga dapat menggunakan ini Guid untuk mengaitkan instans alur kerja dengan status tersimpan dari cakupan yang telah selesai. Anda harus melakukan ini karena Anda harus dapat menandai cakupan yang telah selesai ini sebagai tidak diperlukan saat instans alur kerja selesai.

Mesin runtime alur kerja memanggil waktu akhir saat instans SaveWorkflowInstanceState alur kerja selesai atau dihentikan. Oleh karena itu, jika GetWorkflowStatus sama dengan Completed atau Terminated, Anda dapat dengan aman menghapus instans alur kerja dan semua cakupan lengkap terkait dari penyimpanan data Anda. Atau, Anda dapat berlangganan peristiwa WorkflowCompleted atau WorkflowTerminated untuk menentukan kapan aman untuk menghapus rekaman yang terkait dengan instans alur kerja. Apakah Anda benar-benar menghapus rekaman dari penyimpanan data Anda bergantung pada implementasi Anda.

Jika Anda menerapkan layanan persistensi yang menggunakan penyimpanan tahan lama, maka, untuk menjaga konsistensi dengan status internal mesin runtime alur kerja, Anda harus berpartisipasi dalam batching transaksi alur kerja untuk menunda penulisan aktual ke penyimpanan tahan lama Anda hingga titik penerapan alur kerja. Untuk berpartisipasi dalam batching, tambahkan item kerja yang mewakili perubahan tertunda pada penyimpanan tahan lama Anda ke WorkBatch properti , dan terapkan IPendingWork antarmuka dalam layanan persistensi Anda.

Berlaku untuk