我的Windows Workflow Foundation 之旅---(5)工作流通信例子

本文介绍了一个简单的工作流通信示例,包括通信服务的设计、工作流的实现及宿主的编写,展示了如何通过外部数据交换服务实现工作流与外部系统的交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     [上一节]

     本节我们做一个工作流通信的简单例子,具体的概念请参考上一节的内容。

     一.     通信服务:

     新建一个“顺序工作流控制台应用程序”,然后右键解决方案→添加→新建项目→类库。如图:

删掉默认的“Class”类,新增MessageEventArgs类,代码如下:

 

ContractedBlock.gif ExpandedBlockStart.gif Code
 1 [Serializable]
 2 public class MessageArgs : ExternalDataEventArgs
 3 {
 4 
 5     public MessageArgs(Guid instanceID, string message)
 6         : base(instanceID)
 7     {
 8         this.message = message;
 9     }
10 
11     private string message;
12 
13     public string Message
14     {
15         get { return this.message; }
16     }
17 }

 

 注意:一定要加上Serializable属性

新增“IMessageService”接口,代码如下: 

 

ContractedBlock.gif ExpandedBlockStart.gif Code
1 [ExternalDataExchangeAttribute]
2 public interface IMessageService
3 {
4     void 询问(string message);
5 
6     event EventHandler<MessageArgs> 保存;
7     event EventHandler<MessageArgs> 返回;
8 }

 

注意:一定要加上ExternalDataExchangeAttribute属性

 

     接下来新增“MessageService”类,继承“IMessageService”接口,代码如下:

 

ContractedBlock.gif ExpandedBlockStart.gif Code
 1 public class MessageService:IMessageService
 2 {
 3 
 4     public void 询问(string message)
 5     {
 6         ThreadPool.QueueUserWorkItem(询问消息, new MessageArgs(WorkflowEnvironment.WorkflowInstanceId, message));
 7     }
 8 
 9 
10     public event EventHandler<MessageArgs> 保存;
11 
12     public event EventHandler<MessageArgs> 返回;
13 
14     private void 询问消息(object o)
15     {
16         MessageArgs args = o as MessageArgs;
17         Console.WriteLine("信息为:"+args.Message + ",确定要保存吗?");
18         Console.WriteLine();
19         string response = Console.ReadLine();
20         if (response == "")
21         {
22             保存(nullnew MessageArgs(args.InstanceId, args.Message));
23         }
24         else
25         {
26             返回(nullnew MessageArgs(args.InstanceId, args.Message));
27         }
28     }
29 }

 

     二.     工作流:

     接下来我们回到工作设计器,首先从工具箱中找到“CallExternalMethodActivity”活动,拖拽到设计器中。

     设置它的InterfaceType属性,Method属性和message属性,如图:

     

     然后在从工具箱中找到“ListenActivity”活动,拖拽到设计器中。

     向它的三个分支添加两个“HandleExternalEventActivity”活动和一个“DelayActivity”,最后添加一个“CodeActivity”活动,如图所示:

     然后我们分别设置这些活动的属性,如图:

   接下来我们来看下工作流的代码:

     

ContractedBlock.gif ExpandedBlockStart.gif Code
 1 public sealed partial class Workflow1 : SequentialWorkflowActivity
 2 {
 3     public Workflow1()
 4     {
 5         InitializeComponent();
 6     }
 7 
 8     private string _message;
 9     public string 消息
10     {
11         get { return this._message; }
12         set { this._message = value; }
13     }
14 
15     private bool 状态;
16 
17     private void 结果Activity_ExecuteCode(object sender, EventArgs e)
18     {
19         if (状态)
20         {
21             Console.WriteLine("消息:" + _message + ",保存成功");
22         }
23         else
24         {
25             Console.WriteLine("消息:" + _message + ",不保存,返回");
26         }
27     }
28 
29     private void 保存事件Activity_Invoked(object sender, ExternalDataEventArgs e)
30     {
31         this.状态 = true;
32     }
33 
34     private void 返回事件Activity_Invoked(object sender, ExternalDataEventArgs e)
35     {
36         this.状态 = false;
37     }
38 
39 }

 

     三.     工作流宿主

     最后编写工作流宿主的代码:

     

ContractedBlock.gif ExpandedBlockStart.gif Code
 1 static void Main(string[] args)
 2 {
 3     using(WorkflowRuntime workflowRuntime = new WorkflowRuntime())
 4     {
 5         AutoResetEvent waitHandle = new AutoResetEvent(false);
 6         ExternalDataExchangeService dataService = new ExternalDataExchangeService();
 7         workflowRuntime.AddService(dataService);
 8         dataService.AddService( new MessageService());
 9         workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) {waitHandle.Set();};
10         workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e)
11         {
12             Console.WriteLine(e.Exception.Message);
13             waitHandle.Set();
14         };
15 
16         Dictionary<stringobject> parms = new Dictionary<stringobject>();
17         parms.Add("消息","我叫无忧,大家早上好");
18 
19         WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(Demo1.Workflow1),parms);
20         instance.Start();
21 
22         waitHandle.WaitOne();
23     }
24 }

 

 

     运行结果如图:

     

 

     [源代码]

 

     [下一节]

 

    

转载于:https://www.cnblogs.com/wh19890605/archive/2008/11/09/1329992.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值