一起学WF3.5【14】

宿主把数据发送给一个已执行的工作流来说,也涉及到本地通信服务、事件及为处理这些事件的事件处理程序。为宿主和工作流之间设计好了进行通信所要使用的接口,接口中所添加的方法就是被工作流用来把数据发送给宿主的方法。在该接口中添加的事件能使宿主把数据发送给已经开始执行的工作流。

本例将创建一个WinForm程序。该程序将模拟股票的价格监视并进行交易。用户可添加一支股票,它可让工作流知道如果该股票未被监视到则要进行监视。可以使用AddRemove按钮模拟股票的添加和删除。输入完成后点击OK,这个新的要被监视的股票就被添加进被监视股票的列表中。正监视的股票被保存在应用的Setting文件中(XML)格式以便下一次执行启用。

假如你后来想要修正股份的数量,可将股票买进或卖出。添加、移除、买进和卖出都可以触发一个到工作流的事件。

首先完成工作流和宿主将用来进行通信的接口,然后你要用wce.exe工具来创建继承自CallExternalMethodHandleExternalEvent的一组活动。

创建通信接口

程序只需要一个方法把市场价格信息返回到用户界面上,命名为MarketUpdate。还需要5个分别名为AddTickerRemoveTickerBuyStockSellStockStop的事件来驱动工作流。它们都放在一个接口中。接口名称为IWFBroker

void MarketUpdate(string xmlMarketValues);

       eventEventHandler<TickerActionEventArgs> AddTicker;

       eventEventHandler<TickerActionEventArgs> RemoveTicker;

       eventEventHandler<SharesActionEventArgs> BuyStock;

       eventEventHandler<SharesActionEventArgs> SellStock;

       eventEventHandler<StopActionEventArgs> Stop;

MarketUpdateEventArgsStopActionEventArgs都是ExternalDataEventArgs的增强类型,不传送数据。但TickerActionEventArgsSharesActionEventArgs都传送数据给工作流。TickerActionEventArgs承载要添加和移除的股票的XML数据。而SharesActionEventArgs承载作为主键的股票代码及买卖的股票数目。

同样的需要我们创建外部数据服务,包括一个桥接器类和一个桥接服务类。分别名为BrokerDataConnectorWorkflowBrokerDataService。具体详细代码请见附件。

创建通信活动

同样进行eBrokerService的工程的bin目录。使用wca工具将被解析的方法生成派生自CallExternalMethod活动的类,放入IWFBroker.Invoke.cs;也将那些事件生成派生自HandleExternalEvent活动的类放入IWFBroker.Sinks.cs。把这两个生成的文件重命名为ExternalMethodActivities.csExternalEventHandler.cs,并复制到接下来的工作流项目中,工作流项目成功编译后,工具箱中将出现AddTickerBuyStock等自定义活动。

创建broker工作流

解决方案中添加一个顺序工作流项目名为eBrokerWorkflow

拖一个Code活动到设计设计界面上。ExecuteCode属性设置为Initialize

拖一个EventHandlingScope活动到工作流设计器上。需要提供一个事件处理程序及一个子活动,以便让它监听事件时执行。在EventHandlingScope活动上,根据智能提示选择查看事件处理程序,拖一个EventDriven活动到里面。

拖一个生成的Stop活动到EventDriven活动里。在监听到的Stop活动触发时将要执行一个子活动。在EventHandlingScope活动里选查看EventHandlingScope,拖一个While活动到设计界面上。指定它的Condition属性为代码条件,指定名称为TestContinue

拖一个Sequence活动到While活动中。拖一个Code活动到Sequence活动中,对股票价值进行模拟,指定它的ExecuteCode属性为UpdateMarketValues

为了把值传给宿主,把MarketUpdate活动拖入到Code活动的下面。把它的xmlMarketValues属性的选择按钮打开,创建一个新属性名为Updates

为了能处理来自宿主的事件,拖一个    Listen活动到Sequence活动中。还需要拖3EventDriven活动到其中,对应我们除了Stop事件的其他四个事件,最后一个EventDriven活动用来在延时一段时间后结束该工作流,然后While活动对执行条件进行检测判断,而这个条件总被设置为true以使While活动不停循环。在股票价值被更新并发送给宿主后,Listen活动又对新一轮来自宿主的事件进行监听。

最右边的EventDriven活动,拖一个Delay活动进去并命名为updateDelay

拖一个SellStock活动到右边第二个活动中。把它的NumberOfShares属性绑定到名为_sharesToSell的新字段中。把它的Symbol属性绑定到一个名为_tickerToSell的新字段上。再拖一个Code活动到SellStock活动下面以卖出股票,它的ExecuteCode属性设置为SellStock

按照上述步骤把BuyStock活动拖入,NumberOfShares绑定到一个新字段,名称为_sharesToBuy,同样把它的Symbol属性也绑定到一个新字段,名为_tickerToBuy。同样放一个Code活动,ExecuteCode属性设置为BuyStock

重复以上步骤以添加RemoveTickerAddTicker事件到Listen活动中。RemoveTicker活动的TickerXML属性绑定到一个新字段,名为_tickerToRemvoe,为RemoveTicker事件添加的Code活动的ExecuteCode属性为RemoveTicker。同样,AddTicker活动的TickerXML属性要绑定到_tickerToAdd,和它相联系的Code活动的ExecuteCode活动属性指定为AddTicker

至此,工作流设计完成,现在添加必要的代码。

首先需要一些初始化代码,当工作流启动时,要把一个以股票代码为关键字的若干股票信息的集合的数据字典传给该工作流;也需要指定一个轮询间隔,它是再一次对股票市值进行检测前工作流所要等待的时间值。(代码略,见附件)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值