本节我们做一个工作流通信的简单例子,具体的概念请参考上一节的内容。
一. 通信服务:
新建一个“顺序工作流控制台应用程序”,然后右键解决方案→添加→新建项目→类库。如图:
删掉默认的“Class”类,新增MessageEventArgs类,代码如下:


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”接口,代码如下:


1 [ExternalDataExchangeAttribute]
2 public interface IMessageService
3 {
4 void 询问(string message);
5
6 event EventHandler<MessageArgs> 保存;
7 event EventHandler<MessageArgs> 返回;
8 }
注意:一定要加上ExternalDataExchangeAttribute属性
接下来新增“MessageService”类,继承“IMessageService”接口,代码如下:


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 保存(null, new MessageArgs(args.InstanceId, args.Message));
23 }
24 else
25 {
26 返回(null, new MessageArgs(args.InstanceId, args.Message));
27 }
28 }
29 }
二. 工作流:
接下来我们回到工作设计器,首先从工具箱中找到“CallExternalMethodActivity”活动,拖拽到设计器中。
设置它的InterfaceType属性,Method属性和message属性,如图:
然后在从工具箱中找到“ListenActivity”活动,拖拽到设计器中。
向它的三个分支添加两个“HandleExternalEventActivity”活动和一个“DelayActivity”,最后添加一个“CodeActivity”活动,如图所示:
然后我们分别设置这些活动的属性,如图:
接下来我们来看下工作流的代码:


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 }
三. 工作流宿主
最后编写工作流宿主的代码:


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<string, object> parms = new Dictionary<string, object>();
17 parms.Add("消息","我叫无忧,大家早上好");
18
19 WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(Demo1.Workflow1),parms);
20 instance.Start();
21
22 waitHandle.WaitOne();
23 }
24 }
运行结果如图: