WF4 持久化 第四篇
一、基礎(chǔ)示例
WF4 默認支持SQLServer的持續(xù)化,首先要執(zhí)行目錄C:\Windows\Microsoft.NET\Framework\v4.0.30319\SQL\en下的腳本:
- SqlPersistenceService_Schema.sql
- SqlPersistenceService_Logic.sql
還是Bookmark的示例,新建一個工作流如下:
其中,Bookmark代碼如下:
public sealed class Bookmark1<T> : NativeActivity<T>{public InArgument<string> InParam { get; set; }protected override bool CanInduceIdle{get { return true; }}protected override void Execute(NativeActivityContext context){this.Result.Set(context, "結(jié)果傳出");context.CreateBookmark("Borkmark1", new BookmarkCallback(bookmarkCallback));}//恢復(fù)運行時的回調(diào)函數(shù)void bookmarkCallback(NativeActivityContext context, Bookmark bookmark, object obj){MessageBox.Show("恢復(fù)運行,傳入的參數(shù)是:" + obj); //接收到的參數(shù)this.Result.Set(context, (T)obj);}}新建一個Winform程序如下:
代碼如下:
public partial class Form1 : Form{WorkflowApplication instance = null;SqlWorkflowInstanceStore instanceStore = null;InstanceView view;Guid guid = new Guid();public Form1(){InitializeComponent();}public void InitialWorkflowApplication(){instance = new WorkflowApplication(new WorkflowConsoleApplication1.Workflow1());instance.Idle = workflowIdel; //為掛起綁定事件instance.Completed = workflowCompleted; //為完成綁定事件instance.Unloaded = unload;string connectionString = "Data Source=CZZ;Initial Catalog=xxoo;Integrated Security=True";instanceStore = new SqlWorkflowInstanceStore(connectionString);view = instanceStore.Execute(instanceStore.CreateInstanceHandle(), new CreateWorkflowOwnerCommand(), TimeSpan.FromSeconds(30));instanceStore.DefaultInstanceOwner = view.InstanceOwner;instance.InstanceStore = instanceStore;}private void button1_Click(object sender, EventArgs e){//初始化流程實例 InitialWorkflowApplication();instance.Run();}//持久化private void button3_Click(object sender, EventArgs e){guid = instance.Id;//只有綁定了InstanceStore的工作流才允許卸載 instance.Unload();}//從數(shù)據(jù)庫加載private void button4_Click(object sender, EventArgs e){//初始化流程實例 InitialWorkflowApplication();instance.Load(guid);}//從書簽處恢復(fù)執(zhí)行private void button2_Click(object sender, EventArgs e){if (instance.GetBookmarks().Count() == 1){BookmarkResumptionResult BRR = instance.ResumeBookmark(instance.GetBookmarks()[0].BookmarkName, "inPut");MessageBox.Show("Bookmark恢復(fù)執(zhí)行:" + BRR.ToString());}}void workflowCompleted(WorkflowApplicationCompletedEventArgs e){MessageBox.Show("完成!");}void workflowIdel(WorkflowApplicationIdleEventArgs e){MessageBox.Show("掛起!");}void unload(WorkflowApplicationEventArgs e){MessageBox.Show("卸載!");}}點擊啟動工作流,流程執(zhí)行至Bookmark掛起。點擊持續(xù)化,作為示例,本處直接Unload()了,WF4在Unload之前會持續(xù)化一次。同時,數(shù)據(jù)庫中多個表會發(fā)現(xiàn)增加了一行。
如果此時直接,恢復(fù)執(zhí)行。由于工作流已被卸載,所以會報一個錯誤。所以,應(yīng)該先點擊加載Workflow,此時流程會根據(jù)Guid重新裝載上次未執(zhí)行完畢的流程繼續(xù)執(zhí)行。
二、SqlWorkflowInstanceStore
SqlWorkflowInstanceStore是WF4提供的一個類,需要賦值到WorkflowApplication實例的InstanceStore屬性。
里面保存了數(shù)據(jù)庫連接字符串以及流程所有者等信息。
可用內(nèi)容如下:
| 方法/屬性 | 說明 |
| ConnectionString | 數(shù)據(jù)庫連接字符串 |
| DefaultInstanceOwner | 實例的所有者 |
| HostLockRenewalPeriod | 指定時間段,宿主必須在該時間段內(nèi)續(xù)訂其在工作流服務(wù)實例上的鎖 |
| InstanceCompletionAction | 工作流實例完成后采取的操作。兩個取值:DeleteAll、DeleteNothing(完成后刪還是不刪) |
| InstanceEncodingOption | 是否必須對實例數(shù)據(jù)進行壓縮 |
| InstanceLockedExceptionAction | 當(dāng)捕獲InstanceLockedException時執(zhí)行的操作 |
| MaxConnectionRetries | 獲取或設(shè)置最大 SQL 連接重試次數(shù),默認值為 4 |
| RunnableInstancesDetectionPeriod | 間隔多長時間執(zhí)行檢測任務(wù)。 |
| Execute() | 持久化命令,需要時供提供程序操作 |
三、持久化的方式
有兩種方式可以執(zhí)行持久化。
1、Unload();卸載,這樣WF4會幫助我們持久化一次。
2、Persist();僅僅執(zhí)行持久化操作。
instance.Persist();instance.Unload();3、persist Activity的方式持久化
往視圖里添加一個persist控件,當(dāng)流程執(zhí)行到此步驟就會持久化,不管實例處于何種狀態(tài)。實際上這也是調(diào)用一下instance.Persist();
流程中最好不要帶入一些不相關(guān)的變量或參數(shù),因為SQLServer自帶的持久化是要把這些數(shù)據(jù)序列化為二進制數(shù)據(jù)。如果不能序列化(沒有加一個Dxxxx什么的標(biāo)記的對象),則持續(xù)化不會生效。
總結(jié)
以上是生活随笔為你收集整理的WF4 持久化 第四篇的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为FusionCloud 云计算解决方
- 下一篇: 再学 GDI+[83]: TGPImag