WF4 持久化 第四篇
一、基礎示例
WF4 默認支持SQLServer的持續化,首先要執行目錄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, "結果傳出");context.CreateBookmark("Borkmark1", new BookmarkCallback(bookmarkCallback));}//恢復運行時的回調函數void bookmarkCallback(NativeActivityContext context, Bookmark bookmark, object obj){MessageBox.Show("恢復運行,傳入的參數是:" + obj); //接收到的參數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();}//從數據庫加載private void button4_Click(object sender, EventArgs e){//初始化流程實例 InitialWorkflowApplication();instance.Load(guid);}//從書簽處恢復執行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恢復執行:" + BRR.ToString());}}void workflowCompleted(WorkflowApplicationCompletedEventArgs e){MessageBox.Show("完成!");}void workflowIdel(WorkflowApplicationIdleEventArgs e){MessageBox.Show("掛起!");}void unload(WorkflowApplicationEventArgs e){MessageBox.Show("卸載!");}}點擊啟動工作流,流程執行至Bookmark掛起。點擊持續化,作為示例,本處直接Unload()了,WF4在Unload之前會持續化一次。同時,數據庫中多個表會發現增加了一行。
如果此時直接,恢復執行。由于工作流已被卸載,所以會報一個錯誤。所以,應該先點擊加載Workflow,此時流程會根據Guid重新裝載上次未執行完畢的流程繼續執行。
二、SqlWorkflowInstanceStore
SqlWorkflowInstanceStore是WF4提供的一個類,需要賦值到WorkflowApplication實例的InstanceStore屬性。
里面保存了數據庫連接字符串以及流程所有者等信息。
可用內容如下:
| 方法/屬性 | 說明 |
| ConnectionString | 數據庫連接字符串 |
| DefaultInstanceOwner | 實例的所有者 |
| HostLockRenewalPeriod | 指定時間段,宿主必須在該時間段內續訂其在工作流服務實例上的鎖 |
| InstanceCompletionAction | 工作流實例完成后采取的操作。兩個取值:DeleteAll、DeleteNothing(完成后刪還是不刪) |
| InstanceEncodingOption | 是否必須對實例數據進行壓縮 |
| InstanceLockedExceptionAction | 當捕獲InstanceLockedException時執行的操作 |
| MaxConnectionRetries | 獲取或設置最大 SQL 連接重試次數,默認值為 4 |
| RunnableInstancesDetectionPeriod | 間隔多長時間執行檢測任務。 |
| Execute() | 持久化命令,需要時供提供程序操作 |
三、持久化的方式
有兩種方式可以執行持久化。
1、Unload();卸載,這樣WF4會幫助我們持久化一次。
2、Persist();僅僅執行持久化操作。
instance.Persist();instance.Unload();3、persist Activity的方式持久化
往視圖里添加一個persist控件,當流程執行到此步驟就會持久化,不管實例處于何種狀態。實際上這也是調用一下instance.Persist();
流程中最好不要帶入一些不相關的變量或參數,因為SQLServer自帶的持久化是要把這些數據序列化為二進制數據。如果不能序列化(沒有加一個Dxxxx什么的標記的對象),則持續化不會生效。
總結
以上是生活随笔為你收集整理的WF4 持久化 第四篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为FusionCloud 云计算解决方
- 下一篇: 再学 GDI+[83]: TGPImag