WF4.0 Beta1 自定义持久化PersistenceProvider

 

WF4.0 Beta1 自定义持久化PersistenceProvider

文件持久化类

public class myFilePersistenceProvider : PersistenceProvider

{

string fileName;

 

public myFilePersistenceProvider(string fileName, Guid id)

: base(id)

{

this.fileName = fileName;

}

 

public override void Delete(object instance, TimeSpan timeout)

{

File.Delete(fileName);

}

 

public override IAsyncResult BeginDelete(object instance, TimeSpan timeout, AsyncCallback callback, object state)

{

Delete(instance, timeout);

 

return myFilePersistenceCompletedAsyncResult.Complete(callback, state);

}

 

public override void EndDelete(IAsyncResult result)

{

}

 

public override object Create(object instance, TimeSpan timeout)

{

using (FileStream stream = new FileStream(fileName, FileMode.Create))

{

//System.Runtime.Serialization

NetDataContractSerializer serializer = new NetDataContractSerializer();

serializer.WriteObject(stream, instance);

}

 

return null;

}

 

public override IAsyncResult BeginCreate(object instance, TimeSpan timeout, AsyncCallback callback, object state)

{

Create(instance, timeout);

return myFilePersistenceCompletedAsyncResult.Complete(callback, state);

}

 

public override object EndCreate(IAsyncResult result)

{

return myFilePersistenceCompletedAsyncResult.End(result);

}

 

public override object Load(TimeSpan timeout)

{

return Load(timeout, true);

}

 

public override object Load(TimeSpan timeout, bool lockInstance)

{

object result = null;

using (FileStream stream = new FileStream(fileName, FileMode.Open))

{

NetDataContractSerializer serializer = new NetDataContractSerializer();

result = serializer.ReadObject(stream);

}

 

return result;

}

 

public override IAsyncResult BeginLoad(TimeSpan timeout, AsyncCallback callback, object state)

{

return BeginLoad(timeout, true, callback, state);

}

 

public override IAsyncResult BeginLoad(TimeSpan timeout, bool lockInstance, AsyncCallback callback, object state)

{

object instance = Load(timeout, lockInstance);

 

return myFilePersistenceCompletedAsyncResult.Complete(callback, state, instance);

}

 

public override object EndLoad(IAsyncResult result)

{

return myFilePersistenceCompletedAsyncResult.End(result);

}

 

public override object Update(object instance, TimeSpan timeout)

{

using (FileStream stream = new FileStream(fileName, FileMode.Create))

{

NetDataContractSerializer serializer = new NetDataContractSerializer();

serializer.WriteObject(stream, instance);

}

 

return null;

}

 

public override IAsyncResult BeginUpdate(object instance, TimeSpan timeout, AsyncCallback callback, object state)

{

Create(instance, timeout);

return myFilePersistenceCompletedAsyncResult.Complete(callback, state);

}

 

public override object EndUpdate(IAsyncResult result)

{

return myFilePersistenceCompletedAsyncResult.End(result);

}

 

protected override TimeSpan DefaultCloseTimeout

{

get { return TimeSpan.FromSeconds(30); }

}

 

protected override TimeSpan DefaultOpenTimeout

{

get { return TimeSpan.FromSeconds(30); }

}

 

protected override void OnAbort()

{

}

 

protected override IAsyncResult OnBeginClose(TimeSpan timeout, AsyncCallback callback, object state)

{

return myFilePersistenceCompletedAsyncResult.Complete(callback, state);

}

 

protected override IAsyncResult OnBeginOpen(TimeSpan timeout, AsyncCallback callback, object state)

{

return myFilePersistenceCompletedAsyncResult.Complete(callback, state);

}

 

protected override void OnClose(TimeSpan timeout)

{

}

 

protected override void OnEndClose(IAsyncResult result)

{

}

 

protected override void OnEndOpen(IAsyncResult result)

{

}

 

protected override void OnOpen(TimeSpan timeout)

{

}

}

public class myFilePersistenceCompletedAsyncResult : IAsyncResult

{

object state;

object result;

 

public myFilePersistenceCompletedAsyncResult(object state)

{

this.state = state;

}

 

public object AsyncState

{

get

{

return this.state;

}

}

 

public System.Threading.WaitHandle AsyncWaitHandle

{

get

{

return new System.Threading.ManualResetEvent(true);

}

}

 

public bool CompletedSynchronously

{

get

{

return true;

}

}

 

public bool IsCompleted

{

get

{

return true;

}

}

 

public static IAsyncResult Complete(AsyncCallback callback, object state)

{

return Complete(callback, state, null);

}

 

public static IAsyncResult Complete(AsyncCallback callback, object state, object returnValue)

{

myFilePersistenceCompletedAsyncResult result = new myFilePersistenceCompletedAsyncResult(state);

result.result = returnValue;

 

if (callback != null)

{

callback(result);

}

 

return result;

}

 

public static object End(IAsyncResult result)

{

myFilePersistenceCompletedAsyncResult thisPtr = (myFilePersistenceCompletedAsyncResult)result;

 

return thisPtr.result;

}

}

 

功能类

public class wfTools

{

public static PersistenceProvider createPersistenceProvider(Guid id)

{

return new myFilePersistenceProvider(id.ToString() + ".txt", id);

}

 

public static WorkflowInstance createWorkflow(WorkflowElement workflow, Guid id)

{

 

WorkflowInstance instance = new WorkflowInstance(workflow, id);

 

bindingInstanceEvent(instance);

 

PersistenceProvider pp = createPersistenceProvider(id);

instance.Extensions.Add(pp);

 

return instance;

}

 

 

public static WorkflowInstance loadWorkflow(WorkflowElement workflow, Guid id)

{

PersistenceProvider pp = createPersistenceProvider(id);

WorkflowInstance instance = WorkflowInstance.Load(workflow, pp);

bindingInstanceEvent(instance);

return instance;

}

 

 

static void bindingInstanceEvent(WorkflowInstance instance)

{

 

instance.OnIdle = idel;

instance.OnUnloaded = unloaded;

instance.OnUnhandledException = unhandledException;

instance.OnCompleted = completed;

}

 

 

 

static void unloaded()

{

System.Console.WriteLine("unloaded");

}

 

static IdleAction idel()

{

System.Console.WriteLine("idel");

return IdleAction.Unload;

}

 

static void completed(WorkflowCompletedEventArgs e)

{

System.Console.WriteLine("completed");

}

 

static void aborted(WorkflowAbortedEventArgs e)

{

System.Console.WriteLine("aborted", e.Reason.Message);

}

 

static UnhandledExceptionAction unhandledException(WorkflowUnhandledExceptionEventArgs e)

{

System.Console.WriteLine("unhandledException{0}", e.UnhandledException.Message);

 

return UnhandledExceptionAction.Abort;

}

 

}

 

例子流程

等待触发

public class myBookmark : NativeActivity

{

public string bookmarkName { get; set; }

protected override void Execute(ActivityExecutionContext context)

{

context.CreateNamedBookmark(bookmarkName);

}

}

流程

 

 

使用

第一组代码

Guid id = new Guid("DB35221A-C901-46F7-8075-E65A8D97FE13");

wfTools.openPersistence();

 

WorkflowInstance myInstance = wfTools.createWorkflow(new Sequence1(), id);

myInstance.Run();

 

System.Console.Read();

 

产生的文件:

第二组代码

Guid id = new Guid("DB35221A-C901-46F7-8075-E65A8D97FE13");

wfTools.openPersistence();

 

WorkflowInstance myInstance = wfTools.loadWorkflow(new Sequence1(), id);

myInstance.ResumeBookmark("wxd", null);

 

System.Console.Read();

 

 

文件已自动删除

 

 

posted @   WXWinter(冬)  阅读(1907)  评论(1编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示