日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

WF4 持久化 第四篇

發布時間:2025/5/22 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 持久化 第四篇的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。