Hi guys, morning!
As we know, The workflow runtime engine calls SaveWorkflowInstanceState a final time when the workflow instance is completed or terminated.
Now in my application, i load a persisted workflow instance through my FileWorkflowPersistenceService and make it continue to run successfully. But i don't want SaveWorkflowInstanceState to be called when the loaded workflow instance is completed.
So do we have any method to control this
I will appreciate any of your advice.
Thank you guys in advance!!!
Sincerely!
yours, Ma
------------This is my persistence service class----------------
using System;
using System.Workflow.ComponentModel;
using System.Workflow.Runtime;
using System.Workflow.Runtime.Hosting;
using System.IO;
using System.Threading;
//using System.Collections.Specialized;
using CustomClassLibrary.Properties;
using System.Runtime.InteropServices;
namespace CustomClassLibrary
{
public class WFPersistenceServiceByFile : WorkflowPersistenceService
{
// Member.
private bool unloadOnIdle = false;
// Constructor.
public WFPersistenceServiceByFile(bool unloadOnIdle)
{
this.unloadOnIdle = unloadOnIdle;
}
// Method.
protected override bool UnloadOnIdle(Activity activity)
{
return unloadOnIdle;
}
protected override void SaveWorkflowInstanceState(Activity rootActivity,
bool unlock)
{
// Get the current workflow instance id.
Guid contextGuid = (Guid)rootActivity.GetValue(Activity.ActivityContextGuidProperty);
SerializeToFile( WorkflowPersistenceService.GetDefaultSerializedForm(rootActivity),
contextGuid);
}
private void SerializeToFile(byte[] workflowBytes, Guid id)
{
String filename = CustomClassLibraryResources.PersistFileDirectoryRequestSide + id.ToString();
FileStream fileStream = null;
try
{
if (File.Exists(filename))
{
File.Delete(filename);
}
fileStream = new FileStream(filename, FileMode.CreateNew,
FileAccess.Write, FileShare.None);
// Get the serialized form
fileStream.Write(workflowBytes, 0, workflowBytes.Length);
}
finally
{
if (fileStream != null)
fileStream.Close();
}
}
protected override Activity LoadWorkflowInstanceState(Guid instanceId)
{
byte[] workflowBytes = DeserializeFromFile(instanceId);
Activity resultActivity = WorkflowPersistenceService.RestoreFromDefaultSerializedForm(
workflowBytes, null);
return resultActivity;
}
private byte[] DeserializeFromFile(Guid id)
{
String filename = CustomClassLibraryResources.PersistFileDirectoryApprovalSide + id.ToString();
FileStream fileStream = null;
try
{
// File opened for shared reads but no writes by anyone
fileStream = new FileStream(filename, FileMode.Open,
FileAccess.Read, FileShare.Read);
fileStream.Seek(0, SeekOrigin.Begin);
byte[] workflowBytes = new byte[fileStream.Length];
// Get the serialized form
fileStream.Read(workflowBytes, 0, workflowBytes.Length);
return workflowBytes;
}
finally
{
fileStream.Close();
}
}
protected override void SaveCompletedContextActivity(Activity activity)
{
}
protected override Activity LoadCompletedContextActivity(Guid scopeId, Activity outerActivity)
{
return null;
}
protected override void UnlockWorkflowInstanceState(Activity rootActivity)
{
}
}
}