《WF编程》系列之20 – 触发事件与调用方法:宿主的实现
3.2.3.4 宿主的实现
最后,我们需要编写一个宿主来执行工作流.
WorkflowRuntime runtime = new WorkflowRuntime();
ExternalDataExchangeService dataService;
dataService = new ExternalDataExchangeService();
runtime.AddService(dataService);
BugFlowService bugFlow = new BugFlowService();
dataService.AddService(bugFlow);
AutoResetEvent waitHandle = new AutoResetEvent(false);
runtime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) { waitHandle.Set(); };
runtime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e) { waitHandle.Set(); };
WorkflowInstance instance;
instance = runtime.CreateWorkflow(typeof(BugFlow));
instance.Start();
Bug bug = new Bug(1, "Bug Title", "Bug Description");
bugFlow.CreateBug(instance.InstanceId, bug);
waitHandle.WaitOne();
下面是与宿主程序对话的步骤:
1. 宿主创建了ExternalDataExchangeService并将其加入到工作流Runtime中.这个服务由Windows Workflow提供,用以管理工作流Runtime中的所有本地通信服务,并且将作为BugFlowService的容器.
2. 宿主创建了BugFlowService的实例并将其加入到ExternalDataExchangeService管理的服务列表中. ExternalDataExchangeService将分析IBugFlowService接口,准备s操作BugAdded事件和调用AssignBug方法.
3. 宿主创建了BugFlow工作流的实例并使其运行.工作流实例将等待BugFlow事件的触发.
4. 宿主创建了新的Bug对象,并将其传递给bugFlow的CreateBug方法.
CreateBug方法将触发BugAdded事件.工作流Runtime(凭借数据交换服务的帮助)将捕捉到此事件.执行一些处理,并传递事件给工作流实例.工作流实例也许已经等待了数分钟,数小时,数日甚至更久.当此事件触发时工作流或许已经不在内存里;Runtime或许已经将其持久化到了数据库中.通过监听事件,工作流Runtime有机会在事件传递到达之前去将工作流加载到内存中.接着工作流就可以调用AssignBug方法.

触发事件与调用方法的范例下载:Chapter3_LCS.zip




Windie Chai @ 豆瓣
windiechai @ Twitter
windiechai @ 新浪微博
WF….
我还以为你这个Blog不更新了
看来要继续关注
@notmmao
呵呵,做事要持之以恒嘛.
也���望看到你的文字.
好文章,正在学习这块,非常感谢!
好啊,谢谢!
能不能把宿主与工作流交互再写点东东啊?
这里的bugadd怎么实现没看明白。
搞的不是很懂,这里的宿主应是BugFlowService!太多数还是明白的!
@刘春辉
其实宿主就是这段代码的载体,可以是控制台程序,也可以��WinForm程序,BugFlowService只是工作流Runtime的一个服务。
请问为什么增加了_newBug后就无法删除了?
矢志不移的支持楼主
@空新蔡
咦,貌似朋友最近加入了moss开发群是吧。
小弟我刚接触WF,在编译的时候报了错,希望那位仁兄帮我搞定,小弟我将万分感谢!!!!!!!!!!!!!!!!!!!!!!!!!!
WRN: Assembly binding logging is turned OFF.
To enable assembly bind failure logging, set the registry value [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) to 1.
Note: There is some performance penalty associated with assembly bind failure logging.
To turn this feature off, remove the registry value [HKLM\Software\Microsoft\Fusion!EnableLog].
@yangke
没见过这个错误,不过它都给了解决方案,不妨试一试啊。
@jfan我的理解是这里可以在宿主里挂起一个真正的有用的事件,而这里是null,目的是演示通过事件活动可以从宿主传递数据给工作流。
从中午看到现在,头有点晕。支持楼主!
[...] 关于WF本地通信服务的机制和开发方法,请参见我翻译的《WF编程 – 触发事件与调用方法》(1、2、3)。 [...]