Pausing and Resuming a Workflow
.NET Framework 4
This topic applies to Windows Workflow Foundation 4 (WF4).
Workflows will pause and resume in response to bookmarks and blocking activities such as Delay, but a workflow can also be explicitly paused, unloaded, and resumed by using persistence.
Pausing a Workflow
To pause a workflow, use Unload. This method requests that the workflow persist and unload, and will throw a TimeoutException if the workflow does not unload in 30 seconds.
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); }
Resuming a Workflow
To resume a previously paused and unloaded workflow, use Load. This method loads a workflow from a persistence store into memory.
WorkflowApplication application = new WorkflowApplication(activity);
application.InstanceStore = instanceStore;
application.Load(id);
Example
The following code sample demonstrates how to pause and resume a workflow by using persistence.
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(new Workflow1()); 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; }