Приостановление и восстановление рабочего процесса
Выполнение рабочих процессов будет приостанавливаться и возобновляться при выполнении действий с закладками и блокировками, такими как Delay. Кроме того, рабочие потоки можно будет явным образом приостановить, выгрузить и возобновить с использованием механизма сохраняемости.
Приостановка рабочего процесса
Чтобы приостановить рабочий процесс, пользуйтесь вызовом Unload. Этот метод отправляет запрос на сохранение и выгрузку рабочего процесса. При этом, если рабочий процесс не будет выгружен в течение 30 секунд, будет вызвано исключение TimeoutException.
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);
}
Возобновление рабочих процессов
Чтобы возобновить выполнение ранее приостановленного и выгруженного рабочего процесса, пользуйтесь вызовом Load. Этот метод загружает рабочий процесс из хранилища сохраняемости в память.
WorkflowApplication application = new WorkflowApplication(activity);
application.InstanceStore = instanceStore;
application.Load(id);
Пример
В следующем образце кода описывается приостановка и возобновление выполнения рабочего процесса с помощью механизма сохраняемости.
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;
}