前面我们都是通过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结束