wf(六)

前面我们都是通过WorkflowInvoker这个类来调用方法的,这种方式是很简单的,因为这是同步的而且同样的调用者调用工作流使用的线程是一样的。

另外一个调用工作流的方法是通过工作流应用程序类(WorkflowApplication class),这种方式可以运行工作流在一个单独的线程上运行,并且支持被调用的委托

(当这工作流完成,死锁,或者有一个未处理的异常的时候),应用程序类可以让你创建多线程服务或者客户端程序更简单。

下面我们将用这种方式来调用活动,并获得调用活动的线程id:


 

写一个单元测试,证明工作流的线程id作为返回值返回了:

1. 打开SayHelloFixture.cs 增加引用 using System.Threading和using System.Diagnostics;

2.增加单元测试,如下图:

3运行单元测试会报错,因为我们还没有增加工作流线程的输出参数。


将工作流线程做为输出参数:

打开SayHello.xaml增加输出参数名称为WorkflowThread类型为int32,如图:

目前我们只有一个activity作为Greeting输出,所以我们还需要增加一个activity。

1. 剪切我们之前做的Assign活动;拖拽一个Sequence到设计界面;然后粘贴我们剪切的Assign活动;

2导入命名空间System.Threading,如图:

这个引用其实也不是一定要的,但是为了对Thread有完全的控制权,所以还是添加了。

3拖拽一个Assign到我们事前做的Assign下面,设置如下图:

现在运行测试,测试将通过。如果你想看线程id的值,你可以选择调试选择的单元测试,你会发现单元测试线程id和工作流调用的线程id是一样的,

因为WorkflowInvoker调用工作流和线程是同步的。


 

测试虽然通过了但是还存在一个问题,测试虽然证明了工作流线程返回是非零整数,但是没有证明工作流实际处理的线程id。

我们要做的就是重写单元测试,如下图:

运行单元测试,通过这可以验证上述证明。

到此demo6结束

posted @ 2016-01-05 16:22  HK->胡康  阅读(206)  评论(0编辑  收藏  举报