1、7.拖拽一个While活动到工作流视图设计器界面上,把它放到EventHandlingScope活动内。8.指定它的Condition属性为代码条件而不是声明性规则条件,指定该事件处理程序的名称为TestContinue。一旦Visual Studio添加了该TestContinue事件处理程序后,需要回到工作流视图设计器上,还有更多的活动要进行添加。9.While活动只能接受唯一的一个子活动,因此拖拽一个Sequence活动到该While活动中。10.在这里你需要一个Code活动来对股票价值进行蒙特卡罗模拟,因此拖拽一个Code活动到视图设计器界面上,把它放进你在前一步骤所添加的Sequen
2、ce活动中。在属性窗口中把它重命名为updateMarket。11.指定updateMarket这个Code活动的ExecuteCode属性为UpdateMarketValues。在Visual Studio添加了相应的事件处理程序后回到工作流视图设计器界面上来,以便继续布置你的工作流。12.在模拟完成后(你将添加的代码实际上就是进行模拟),你需要把这些潜在的进行了修改的值传给宿主应用程序。为此,把鼠标指针移到工具箱上,找到你在IWFBroker中创建的MarketUpdate活动,把它拖到视图设计器界面上并放到Sequence活动中的你在前一步骤中所添加的Code活动的下面。13.Marke
3、tUpdate活动需要把一小段XML放送给宿主,要做到这一点,它必须绑定到容纳有此时将发送的XML的字段属性。为此,在Visual Studio的属性面板中选择xmlMarketValues属性,然后点击浏览(.)按钮,打开一个“将xmlMarketValues绑定到活动的属性”的对话框。然后点击绑定到新成员选项卡,点击创建属性,在新成员名称中输入Updates。最后点击确定。Visual Studio就添加了Updates这个依赖属性。14.为了让你能处理来自于宿主的事件,拖拽一个Listen活动到设计器界面上,把它放进Sequence活动中。15.假如你回忆一下,你会记起IWFBroker
4、接口声明了五个事件,它们中的一个是我们已经用过的Stop,还有四个事件要去处理。Listen活动目前仅仅容纳了两个EventDriven活动,但添加更多的EventDriven活动也很容易。你需要简单地拖拽多达三个的EventDriven活动进Listen活动中。为什么要添加三个而不是正好的两个呢?因为第五个EventDriven活动要包含一个行为像是定时器的Delay活动,当延时过期后,Listen活动会结束该工作流线程。然后While活动对执行条件进行检测判断,而返回的这个条件总被设置为true,于是使While活动不停地循环。在股票价值被更新并发送给宿主后,Listen活动又对新一轮来自
5、宿主的事件进行监听。16.在最右边的EventDriven活动中,拖拽并放入一个Delay活动,在属性面板中把它命名为updateDelay。17.接下来从eBrokerFlow中拖拽一个SellStock活动到工作流视图设计器界面上,把它放到从右边数起的第二个EventDriven活动中。18.在Visual Studio的属性面板中选择NumberOfShares属性,点击浏览(.)按钮,这会又一次打开一个“将NumberOfShares绑定到活动的属性”的对话框。点击绑定到新成员选项卡,然后再点击创建字段,并在新成员名称中输入_sharesToSell,最后点击确定。Visual Stu
6、dio就添加了这个_sharesToSell字段。我在这里选择创建_sharesToSell依赖属性而不是字段是因为字段从来不会被Workflow1类的外部访问到。它提供的基于XML格式的市场价值信息要传给宿主,因此应当把外部访问权限暴露出来。19.Symbol属性也必须进行绑定。下面的步骤和上一步骤是一样的,只是字段名称要命名为_tickerToSell。20.为了卖出股票,要拖拽一个Code活动放到SellStock事件处理程序的下面。在它的ExecuteCode属性中输入SellStock,在插入了对应的事件处理程序后请回到工作流视图设计器界面上来。21.我们现在要对买股票的逻辑进行添加
7、。拖拽一个BuyStock事件处理活动(也来自于eBrokerFlow)到设计器界面上,把它放到正中间的EventDriven活动中。22.使用第18步的步骤,把BuyStock活动的NumberOfShares属性绑定到一个新的字段,名称为_sharesToBuy。同样,使用第19步的步骤,把它的Symbol属性也绑定到一个新的字段,名称为_tickerToBuy。23.和你需要一个Code活动去卖股票一样,你也需要一个Code活动去买股票。重复第12步添加一个新的Code活动,设置它的ExecuteCode属性为BuyStock。24.重复第17步至第20步两次,把RemoveTicker
8、和AddTicker事件也添加到Listen活动中。RemoveTicker活动的TickerXML属性要绑定到一个新的名称为_tickerToRemove的字段,而为该RemoveTicker事件添加的Code活动的ExecuteCode属性指定为RemoveTicker。同样地,AddTicker活动的TickerXML属性要绑定到_tickerToAdd,和它相联系的Code活动的ExecuteCode属性指定为AddTicker。完成这些后,Listen活动的外观如下所示:25.编译你的这个工作流,纠正任何出现的编译错误。26.在Visual Studio中打开Workflow1.cs
9、的源文件准备进行编辑。27.Visual Studio为你添加了大量的代码,因此你首先定位到Workflow1的构造器并在该构造器下添加如下的代码。你插入的这些代码可被认为是初始化代码。当工作流启动时,你将把一个数据字典传给该工作流,这个数据字典包含有以股票代码(如“CONT”)作为关键字的要监视的若干股票信息的集合。你也需要指定一个轮询间隔,它是再一次对股票市值进行检测前工作流所要等待的时间值。private Dictionary _items =new Dictionary();private string _tickersXML = null;public string TickersX
10、MLget return _tickersXML; set _tickersXML = value;private TimeSpan _interval = TimeSpan.FromSeconds(7);public TimeSpan PollIntervalget return _interval;set _interval = value;28.下面定位到你在步骤2中为你的第一个Code活动添加的Initialize事件处理程序。插入下面的代码:Initialize/ Establish the market update timeoutupdateDelay.TimeoutDurati
11、on = PollInterval;/ Stuff the known ticker values into the dictionary/ for later recall when updating market conditions.eBrokerService.Tickers tickers = null;using (StringReader rdr = new StringReader(TickersXML)XmlSerializer serializer =new XmlSerializer(typeof(eBrokerService.Tickers);tickers = (eB
12、rokerService.Tickers)serializer.Deserialize(rdr);foreach (eBrokerService.Ticker ticker in tickers.Items)/ Add the ticker to the dictionary_items.Add(ticker.Symbol, ticker);提示:为了方便,我在这个初始化方法中对该Delay活动的TimeoutDuration进行了指定。但是不要忘了,你也能使用Delay活动的InitializeTimeoutDuration方法来做同样的工作。29.找到TestContinue事件处理程序,
13、While活动使用它来对是否继续进行循环进行判断。插入下面的代码让While活动不停循环(不用担心.实际上它最终会停止循环的!):/ Continue forevere.Result = true;30.下面要插入的代码块很长,它使用了蒙特卡罗模拟来对股票市场价进行更新。找到和名称为updateMarket的Code活动(参见第10步)相对应的UpdateMarketValues事件处理程序,插入下面的代码:UpdateMarketValues/ Iterate over each item in the dictionary and decide/ what its current valu
14、e should be. Normally wed call/ some external service with each of our watch values,/ but for demo purposes well just use random values.Random rand = new Random(DateTime.Now.Millisecond);eBrokerService.UpdateCollection updates = new eBrokerService.UpdateCollection();foreach (string key in _items.Key
15、s)/ Locate the itemeBrokerService.Ticker item = _itemskey;/ If were starting out, we have no current value,/ so place the value at half the distance between the/ buy and sell triggers.if (item.LastPrice / Add delta to buy trigger valueitem.LastPrice = item.BuyTrigger + delta; / ifelse/ Reverse it an
16、d add to the sell trigger/ valueitem.LastPrice = item.SellTrigger + delta; / else / if/ Set up the simulationdecimal newPrice = item.LastPrice;decimal onePercent = item.LastPrice * 0.1m;Int32 multiplier = 0; / no change/ Well now roll some dice. First roll: does the/ market value change? 0-79, no. 8
17、0-99, yes.if (rand.Next(0, 99) = 80)/ Yes, update the price. Next roll: will the/ value increase or decrease? 0-49, increase./ 50-99, decreasemultiplier = 1;if (rand.Next(0, 99) = 50)/ Decrease the price.multiplier = -1;/ Next roll, by how much? Well calculate it/ as a percentage of the current shar
18、e value./ 0-74, .1% change. 75-89, .2% change. 90-97,/ .3% change. And 98-99, .4% change.Int32 roll = rand.Next(0, 99);if (roll 75)/ 1% changenewPrice = item.LastPrice + (onePercent * multiplier * 0.1m);else if (roll 0 ? Up : (multiplier = 0 ?FirmDown);update.Action = newPrice item.SellTrigger ?Sell
19、 (newPrice = 0 ?item.NumberOfShares - _sharesToSell : 0;catch/ Do nothingwe just wont have sold any.32.找到BuyStock事件处理程序,添加下面的代码:BuyStock/ Increase the number of shares for the given ticker./ Find this ticker.eBrokerService.Ticker item = _items_tickerToBuy;if (item !/ Increase the number of shares.item.NumberOfShares += _sharesToBuy;/ Do nothingwe just wont have purchased any.33.接下来是RemoveTicker,找到它并插入下面的代码:RemoveTicker/ Remove the given ticker from the watch./ DeserializeeBrokerService.Ticker ticker = null;using (StringReade
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1