WorkflowPersistenceService.SaveWorkflowInstanceState Metoda
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Při implementaci v odvozené třídě uloží stav instance pracovního postupu do úložiště dat.
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)
Parametry
- rootActivity
- Activity
Kořenová aktivita instance pracovního postupu.
- unlock
- Boolean
true
Pokud instance pracovního postupu by neměla být uzamčena; false
pokud má být instance pracovního postupu uzamčena.
Příklady
Následující příklad ukazuje implementaci SaveWorkflowInstanceState
metody . Tento příklad je z ukázky vlastní služby trvalosti ze souboru FilePersistenceService.cs. Další informace najdete v ukázce vlastní služby trvalosti.
// 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
Poznámky
Je nutné volat jednu z přetížených Save metod serializovat rootActivity
do Stream. Před zápisem Stream do úložiště dat pak můžete zvolit další zpracování. Pokud však modul runtime pracovního postupu volá LoadWorkflowInstanceState, musíte obnovit identickou kopii kořenové aktivity. Pokud nemůžete uložit stav instance pracovního postupu do úložiště dat, měli byste vyvolat příslušnou chybovou PersistenceException zprávu.
Modul runtime pracovního postupu poskytuje sémantiku uzamčení, která omezuje přístup ke stavu instance pracovního postupu, který je uložen v úložišti dat. K tomu můžou přistupovat služby trvalosti spuštěné na více hostitelích a odkazující na stejné úložiště dat. Sémantika uzamčení je navržena tak, aby zabránila službám trvalosti, které běží ve dvou různých modulech runtime pracovního postupu, v načtení stejné instance pracovního postupu do paměti ve stejnou dobu. V závislosti na typu prostředí, pro které je vaše služba trvalosti navržená, můžete zvolit, jestli chcete tuto funkci podporovat. Pokud se rozhodnete podporovat sémantiku uzamčení modulu runtime, pak pokud se služba trvalosti pokusí uložit stav instance pracovního postupu, který byl dříve uzamčen jinou službou trvalosti, měli byste vyvolat WorkflowOwnershipException. Pokud unlock
je true
, měli byste po uložení odemknout přístup ke stavu instance pracovního postupu.
LoadWorkflowInstanceState Guid přebírá instanci pracovního postupu jako parametr. Proto byste měli tento Guidsoubor uložit . Můžete ho Guid také použít k přidružení instance pracovního postupu k uloženým stavům jeho dokončených oborů. Musíte to udělat, protože po dokončení instance pracovního postupu musíte být schopni tyto dokončené obory označit jako nepotřebné.
Modul runtime pracovního postupu volá SaveWorkflowInstanceState konečný čas, když je instance pracovního postupu dokončena nebo ukončena. Proto pokud GetWorkflowStatus se rovná Completed nebo Terminated, můžete bezpečně odstranit instanci pracovního postupu a všechny jeho přidružené dokončené obory z úložiště dat. Případně se můžete přihlásit k odběru WorkflowCompleted událostí nebo WorkflowTerminated a určit, kdy je bezpečné odstranit záznamy přidružené k instanci pracovního postupu. To, jestli skutečně odstraníte záznamy z úložiště dat, závisí na vaší implementaci.
Pokud implementujete službu trvalosti, která používá trvalé úložiště, pak, chcete-li zachovat konzistenci s interním stavem modulu modulu runtime pracovního postupu, měli byste se účastnit dávkování transakcí pracovního postupu a odložit skutečný zápis do trvalého úložiště až do bodu potvrzení pracovního postupu. Pokud se chcete zapojit do dávkování, přidejte do vlastnosti pracovní položku, která představuje čekající změny úložiště trvalých WorkBatch změn, a implementujte IPendingWork rozhraní ve službě trvalosti.