Anhalten und Fortsetzen eines Workflows
Workflows werden in Abhängigkeit von Lesezeichen und Blockieraktivitäten wie Delay angehalten und fortgesetzt, können jedoch auch durch Persistenz explizit angehalten, entladen und wieder aufgenommen werden.
Anhalten eines Workflows
Verwenden Sie Unload, um einen Workflow anzuhalten. Mit dieser Methode wird das Beibehalten und Entladen des Workflows angefordert, und eine TimeoutException wird ausgelöst, wenn der Workflow nicht innerhalb von 30 Sekunden entladen wird.
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);
}
Wiederaufnehmen von Workflows
Verwenden Sie Load, um einen Workflow wiederaufzunehmen, der angehalten und entladen wurde. Diese Methode lädt einen Workflow aus einem Persistenzspeicher in den Arbeitsspeicher.
WorkflowApplication application = new WorkflowApplication(activity);
application.InstanceStore = instanceStore;
application.Load(id);
Beispiel
Im folgenden Codebeispiel wird veranschaulicht, wie ein Workflow mithilfe der Persistenz angehalten und fortgesetzt werden kann.
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;
}