Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Werkstromen worden onderbroken en hervat als reactie op bladwijzers en blokkeringsactiviteiten zoals Delay, maar een werkstroom kan ook expliciet worden onderbroken, uitgepakt en hervat met behulp van persistentie.
Een werkstroom onderbreken
Als u een werkstroom wilt onderbreken, gebruikt u Unload. Met deze methode wordt aangevraagd dat de werkstroom behouden blijft en wordt verwijderd en wordt er een TimeoutException gegenereerd als de werkstroom niet binnen 30 seconden wordt verwijderd.
try
{
// attempt to unload will fail if the workflow is idle within a NoPersistZone
application.Unload(TimeSpan.FromSeconds(5));
}
catch (TimeoutException e)
{
Console.WriteLine(e.Message);
}
Een werkstroom hervatten
Als u een eerder onderbroken en niet-geladen werkstroom wilt hervatten, gebruikt u Load. Met deze methode wordt een werkstroom uit een persistentiearchief in het geheugen geladen.
WorkflowApplication application = new WorkflowApplication(activity);
application.InstanceStore = instanceStore;
application.Load(id);
Opmerking
In het volgende codevoorbeeld ziet u hoe u een werkstroom kunt onderbreken en hervatten met behulp van persistentie.
static string bkName = "bkName";
static void Main(string[] args)
{
StartAndUnloadInstance();
}
static void StartAndUnloadInstance()
{
AutoResetEvent waitHandler = new AutoResetEvent(false);
WorkflowApplication wfApp = new WorkflowApplication(GetDelayedWF());
SqlWorkflowInstanceStore instanceStore = SetupSqlpersistenceStore();
wfApp.InstanceStore = instanceStore;
wfApp.Extensions.Add(SetupMyFileTrackingParticipant);
wfApp.PersistableIdle = (e) => { ///persists application state and remove it from memory
return PersistableIdleAction.Unload;
};
wfApp.Unloaded = (e) => {
waitHandler.Set();
};
Guid id = wfApp.Id;
wfApp.Run();
waitHandler.WaitOne();
LoadAndCompleteInstance(id);
}
static void LoadAndCompleteInstance(Guid id)
{
Console.WriteLine("Press <enter> to load the persisted workflow");
Console.ReadLine();
AutoResetEvent waitHandler = new AutoResetEvent(false);
WorkflowApplication wfApp = new WorkflowApplication(GetDelayedWF());
wfApp.InstanceStore =
new SqlWorkflowInstanceStore(ConfigurationManager.AppSettings["SqlWF4PersistenceConnectionString"].ToString());
wfApp.Completed = (workflowApplicationCompletedEventArgs) => {
Console.WriteLine("\nWorkflowApplication has Completed in the {0} state.",
workflowApplicationCompletedEventArgs.CompletionState);
};
wfApp.Unloaded = (workflowApplicationEventArgs) => {
Console.WriteLine("WorkflowApplication has Unloaded\n");
waitHandler.Set();
};
wfApp.Load(id);
wfApp.Run();
waitHandler.WaitOne();
}
public static Activity GetDelayedWF()
{
return new Sequence {
Activities ={
new WriteLine{Text="Workflow Started"},
new Delay{Duration=TimeSpan.FromSeconds(10)},
new WriteLine{Text="Workflow Ended"}
}
};
}
private static SqlWorkflowInstanceStore SetupSqlpersistenceStore()
{
string connectionString = ConfigurationManager.AppSettings["SqlWF4PersistenceConnectionString"].ToString();
SqlWorkflowInstanceStore sqlWFInstanceStore = new SqlWorkflowInstanceStore(connectionString);
sqlWFInstanceStore.InstanceCompletionAction = InstanceCompletionAction.DeleteAll;
InstanceHandle handle = sqlWFInstanceStore.CreateInstanceHandle();
InstanceView view = sqlWFInstanceStore.Execute(handle, new CreateWorkflowOwnerCommand(), TimeSpan.FromSeconds(5));
handle.Free();
sqlWFInstanceStore.DefaultInstanceOwner = view.InstanceOwner;
return sqlWFInstanceStore;
}