日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
詳解WF4.0中如何實現(xiàn)子流程

在WF 4.0中,存在不同種類的流程。本文將介紹的子流程如何在主流程中實現(xiàn)的原理,希望對大家有所幫助。

工作流服務(wù)中,經(jīng)常會在主流程啟用一些子流程。我在審批流程中經(jīng)常會使用bookmark來暫停流程,這篇文章,將結(jié)合bookmark來實現(xiàn)主流程啟動子流程。

使用以前的一篇WF4.0自定義持久化中的自定義的持久化。不過數(shù)據(jù)表中加入了一個字段parentid,用于標(biāo)識父流程:

下面用一個流程實例為例說明主流程是如何啟用子流程,子流程又是如何返回主流程的,主流程如下:

***個節(jié)點“***站審核”和第三個節(jié)點“第二站審核”都是BookMark書簽,附BookMark的代碼如下:

代碼

 
 
 
  1. public sealed class Read : NativeActivity
  2.     {
  3.         public Read()
  4.             : base()
  5.         {
  6.         }
  7.         public string BookmarkName { get; set; }
  8.         // Define an activity input argument of type string
  9.         public InArgument Text { get; set; }
  10. // Must return true for a NativeActivity that creates a bookmark
  11.         protected override bool CanInduceIdle
  12.         {
  13.             get { return true; }
  14.         }
  15.         protected override void Execute(NativeActivityContext context)
  16.         {
  17. context.CreateBookmark(this.BookmarkName, new BookmarkCallback(this.Continue));
  18.         }
  19.  void Continue(NativeActivityContext context, Bookmark bookmark, object obj)
  20.         {
  21.             this.Result.Set(context, (TResult)obj);
  22.         }

第二個節(jié)點“啟用子流程”,它是一個自定義的節(jié)點,代碼如下:

代碼

 
 
 
  1. public sealed class CallChild : Activity
  2.    {
  3.        public string FlowName { get; set; }
  4.        public CallChild()
  5.        {
  6.   base.Implementation = new Func(CreateBody);
  7.        }
  8.        public Activity CreateBody()
  9.        {
  10.            return new Sequence
  11.            {
  12.                DisplayName = "子流程",
  13.                Activities =
  14.                    {   
  15.                        new ChildCodeActivity
  16.                        {
  17.                            FlowName=this.FlowName      
  18.                        }
  19.                        ,
  20.                        new Read
  21.                        {
  22.                            BookmarkName="CallChild",
  23.                         
  24.                        }                 
  25.                    }       };        }    }

注意上面的ChildCodeActivity類,實際上是在ChildCodeActivity中啟動子流程的,ChildCodeActivity后面是一個書簽,用于暫停主流程。當(dāng)子流程完成后,在子流程中恢復(fù)這個書簽,子流程結(jié)束,主流程繼續(xù)往下跑。這個活動中有一個FlowName屬性,用于表示是啟用哪個子流程。ChildCodeActivity代碼如下:

代碼

 
 
 
  1. sealed class ChildCodeActivity : CodeActivity
  2.     {
  3. // Define an activity input argument of type string
  4.         public string FlowName { get; set; }
  5. // If your activity returns a value, derive from CodeActivity
  6. // and return the value from the Execute method.
  7.         protected override void Execute(CodeActivityContext context)
  8.         {
  9.             Guid ChildGuid;
  10.             ChildGuid = WorkFlowRun.CreateAndRun(FlowName);
  11. InstancesTable obj = InstancesTableBiz.GetInstancesTable(ChildGuid);
  12. //取得子流程的id
  13.             obj.parentid = context.WorkflowInstanceId;
  14.             InstancesTableBiz.UpdateInstancesTable(obj);//跟新父流程id
  15.         }
  16.     }

WorkFlowRun.CreateAndRun(FlowName)根據(jù)FlowName啟動相應(yīng)的子流程,并得到實例的Guid。并將子流程的parentid修改改成主流程的guid。

子流程的示例如下:

#T#

子流程的***個節(jié)點“子流程***站審核”和第二個節(jié)點“子流程第二站審核”也都是BookMark書簽。

***一個節(jié)點是“結(jié)束”。這個節(jié)點也至關(guān)重要,因為我是使用這個節(jié)點,從子流程中返回到主流程的。因此,每個子流程都會有End節(jié)點,它的代碼如下:

代碼

 
 
 
  1. public sealed class End : CodeActivity
  2.   {
  3.       // Define an activity input argument of type string
  4.       public InArgument Text { get; set; }
  5.  // If your activity returns a value, derive from CodeActivity
  6.       // and return the value from the Execute method.
  7.       protected override void Execute(CodeActivityContext context)
  8.       {
  9.           // Obtain the runtime value of the Text input argument
  10.           string text = context.GetValue(this.Text);
  11.           Guid id = context.WorkflowInstanceId;
  12.           InstancesTable Obj = InstancesTableBiz.GetInstancesTable(id);
  13.           if (Guid.Empty != Obj.parentid)//如果是子流程,返回父流程
  14.           {
  15.   WorkFlowRun.Submit(Obj.parentid, "ParentProcess", "returnMain");
  16.           }
  17.       }
  18.   }

這是我思考出的在WF4.0中一個啟用子流程的方案,如果你有什么更好的方案和建議,請給我留言,謝謝。

鏈接:http://www.cnblogs.com/zhuqil/archive/2010/01/31/SubProcessDemo.html


本文標(biāo)題:詳解WF4.0中如何實現(xiàn)子流程
網(wǎng)頁URL:http://www.dlmjj.cn/article/cdehehj.html