成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解WF 4.0中如何實現子流程

開發 后端
本文將為大家介紹WF 4.0中,如何在主流程中啟用一些子流程,并通過簡單實例來詳細介紹實現過程。

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

工作流服務中,經常會在主流程啟用一些子流程。我在審批流程中經常會使用bookmark來暫停流程,這篇文章,將結合bookmark來實現主流程啟動子流程。

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

代碼

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

主流程

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

代碼

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

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

代碼

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

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

代碼

  1. sealed class ChildCodeActivity : CodeActivity  
  2.     {  
  3. // Define an activity input argument of type string  
  4.         public string FlowName { getset; }  
  5. // If your activity returns a value, derive from CodeActivity<TResult>  
  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)根據FlowName啟動相應的子流程,并得到實例的Guid。并將子流程的parentid修改改成主流程的guid。

子流程的示例如下:

子流程的示例

#T#

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

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

代碼

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

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

原文標題:WF4.0中實現子流程

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

責任編輯:彭凡 來源: 博客園
相關推薦

2010-01-14 14:12:14

Visual Stud

2009-07-16 10:41:40

WF 4.0 beta

2010-01-14 09:35:10

WF4.0

2009-06-15 10:20:47

WF 4.0 Beta跟蹤機制

2009-10-28 09:23:27

WF4.0 Beta2

2009-06-17 10:51:58

WF4.0規則引擎

2009-06-22 09:36:06

WF 4.0 beta跟蹤配置

2009-10-22 08:54:56

WF4 Beta 2

2009-12-04 09:14:05

.NET 4.0

2009-03-23 10:54:12

.NET契約式編程編程思想

2009-10-20 15:03:29

ExpandoObje

2023-11-29 15:53:45

2009-05-20 10:26:09

Visual StudWF微軟

2010-01-05 09:26:13

.NET 4.0

2009-09-27 10:03:53

Silverlight

2009-07-24 10:00:38

.NET 4.0內存映

2023-10-04 09:44:56

Btrfs子卷

2011-08-29 14:59:26

QtEvent事件

2009-06-03 14:50:17

C# 4.0泛型協變性

2009-03-10 13:51:36

編譯器VS2010C#
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美成人a | 中文字幕一区二区三区不卡在线 | 国产精品久久久久久久模特 | 亚洲第一天堂无码专区 | 日韩一区二区三区精品 | 91免费在线播放 | 国产精品国色综合久久 | 久草综合在线视频 | 午夜国产精品视频 | 亚洲人成人一区二区在线观看 | av一二三区| 国产精品亚洲视频 | 免费在线精品视频 | 中文字幕亚洲一区二区三区 | 91热在线| 婷婷久久五月天 | 久久精品免费 | 久久中文字幕一区 | 欧美日韩国产在线 | 精品国产乱码久久久久久闺蜜 | 国产精品视频免费观看 | 日韩av在线一区二区三区 | 精品免费| 亚洲福利视频网 | 午夜精品久久久久久久久久久久久 | 成人一区二区三区在线 | 91久久北条麻妃一区二区三区 | 久久国产精品久久久久久 | 一区二区三区四区av | 美日韩精品 | 一级黄色片免费在线观看 | www.成人.com | 男女羞羞视频在线免费观看 | 日本电影韩国电影免费观看 | 久久视频精品 | 在线观看黄色 | 涩涩视频在线播放 | 日本免费视频在线观看 | 精品久久久久久亚洲综合网 | 日本在线网站 | 日本超碰|