,这篇文章主要是帮自己复习一下。
1. WF项目包括4个:
Activity Designer Library
Activity Library
Workflow Console Application
WCF workflow service Application
2. Activity文件使用xaml格式
3. WF的活动时枝叶树结构。 FlowChar(图结构)和Sequence(顺序结构)是常用的两个直接点。
4, WriteLineActivity是常用的一个Activity,注意他的TextWrite属性允许我们用自己的TextWrite类,只要继承System.IO.TextWriter即可。
5, 可以在代码中使用ActivityXamlService.Load(Stream stream)方法用代码加载一个Activity.
6, 可以继承CodeActivity类来实现自己的Activity,需要override Execute方法。
7,使用Variables可以在Activity中设置变量,变量可以在各自的适用范围中使用。
8.可以使用Arguments来设置出入传出参数。 其中In是传入,out是传出,InOut相当于ref,Property是属性(可以使用ActivityAction和ActivityFunc)。
1).In参数使用Dictionary<string,object>来传入和传出. in参数在外部不会改变。
2).Out参数使用Completed(WorkflowApplicationCompletedEventArges e) {string outArg=e.Outputs["ArgName"].Tostring()}这种方法得到。
9. 几个基础的控制流Activity
If Swith<T> While DoWhile Foreach<T>
10,Parallel并行容器 Pick,PickBaranch触发容器(这种只会触发一个PickBranch的内容) ParallelForEach<T>循环
11. Collection集合操作 . 复杂对象的集合操作,建议使用SortedSet<T>
1). AddToCollection<T>
2). RemoveFromCollection<T>
3). ClearCollection<T>
4). ExistsInCollection<T>
12. 键值对集合操作,建议使用SortedList<K,V>集合
13. WF的一场产生方式与流程结束方式
WF的异常可以由以下方式产生:
1). 使用Throw Activity 抛出异常 (不会在异常出断掉)
2). 代码运行错误 (会在异常处断掉)
WF流程结束方式:
1). WF实例如果在运行过程中没有出现问题,ActivityInstanceState由Executing变为Closed
2).如果流程
被调用Terminate方法
遇到TerminateWorkflow Activity
产生异常时没有用WorkflowApplication.OnUnhandledException
产生异常时指定UnHandledExceptionAction.Terminal
以上情况产生时,ActivityInstanceState由Executing变成Faulted。
3). 如果流程
被调用Canceled方法
产生异常时指定UnHandledExceptionAction.Canceled
以上情况产生时,ActivityInstanceState由Executing变成Canceled。
4).如果流程
被调用Aborted方法
产生异常时指定UnHandledExceptionAction.Aborted
以上情况产生时,流程会运行失败,并处罚Aborted,运行失败的流程没有ActivityInstanceState实例状态。
5). ActivityInstanceState的Closed,canceled,faulted都表示流程结束,并处罚Completed.14. 可以使用TryCatch和Catch<T> 异常捕获 可以使用Rethrow再次抛出异常
15. 可以使用terminalActivity来结束流程,但是状态为Fault。
16. CancellationScope取消容器,如果是正常执行到CancellationScope容器的话,那么正常结束,state为closed。如果内部发生异常,并且OnUnhandledException返回Cancel的时候,调用CancelledScope容器,State为Cancled。
17. 在Parallel中使用CancellationScope,当parallel的CompletionCondition为True是,那么其中一个分钟的CancellationScope被触发的话,就会结束流程,结果为Closed。
18. InvokeMethod调用方法。
静态方法: 在TargetType中填充静态类,MethodName中填充静态方法。在parameters中写入in,out,in/out参数。在Result中写入返回值variable。当然也可以调用泛型方法。
实例方法: 只需要在TargetObject中给出类的实例即可。
19. WF的实例是单线程运行的。可以使用Depay Activity来使线程等待。注意:Delay并不是Thread.Sleep,Parallel是单线程运行的。
1)如果一个Parallel由两个分支,每个分支都有一个Thead.Sleep(10000),那么结果将是delay了20秒,这说明,parallel是单线程运行的。
2) 如果一个Parallel有两个分支,每个分支都有一个Delay 10秒,那么结果是delay了10秒,这说明Delay是被特殊处理的。
20. WorkflowInvoker是单线程的, WorkflowApplication是多线程调用的。
如果一个WorkflowInvoker同时Invoke两个Activity,那么结果将是
如果一个WorkflowApplicationi同时加载两个Activity,那么结果将是
21. InvokeMethod 调用异步方法
1,需要将InvokeMethod的RunAsynchronously属性为True
2,需要如下的两个方法;
1). IAsyncResult Begin[原史方法] ([原史方法参数], AsyncCallback callback, object asyncState)
void End[原史方法] (IAsyncResult r)
2).当[RunAsynchronously]属性设为[False]时, [InvokeMethod]调用[原史方法]
3).当[RunAsynchronously]属性设为[True]时, [InvokeMethod]调用对应的[Begin原史方法]与[End原史方法]方法
4).如果没的提供与[原史方法]对应的[Begin原史方法]与[End原史方法]方法, [InvokeMethod]将忽略[RunAsynchronously]属性的值
MethodName属性的[Begin原史方法]和[End原史方法]不会调用,调用的是[原史方法]
22.如果想要 InvokeMethod调用异步方法时等待异步方法完成后,流程才继续向下执行, 需要将IAsyncResult接口的CompeltedSynchronously属性要返回False。