当前位置: 首页 > news >正文

WF4.0 基础篇 (二十一) WorkflowInvoker

 

本节主要介绍WF4 中 WorkflowInvoker的使用

本文例子下载:

http://files.cnblogs.com/foundation/WorkflowInvokerSample.rar

 

本文例子说明

 

 

WorkflowInvoker

类名

System.Activitys.WorkflowInvoker

文件

System.Activities.dll

结构说明

继承 Object

是一个 sealed类

override 了 [CacheMetadata方法] 与 [Execute方法]

功能说明

WorkflowApplication与WorkflowInvoker在调用流程上的区别

在WF4.0中,可以使用WorkflowApplication与WorkflowInvoker创建并启动实例.

但两者在宿主中的线程方式是不一样的

 

使用WorkflowInvoker启动工作流时,工作流将附加到宿主的线程中执行

使用WorkflowApplication启动工作流,工作流实例将在宿主线程之外的另一个线程中运行,使用的是线程池方式

 

具体见[Delay 与WF4中的线程]

 

WorkflowInvoker静态方式

public static TResult Invoke<TResult>(Activity<TResult> workflow);

 

public static IDictionary<string, object> Invoke(Activity workflow);

 

public static TResult Invoke<TResult>(Activity<TResult> workflow, IDictionary<string, object> inputs);

 

public static IDictionary<string, object> Invoke(Activity workflow, IDictionary<string, object> inputs);

 

public static IDictionary<string, object> Invoke(Activity workflow, TimeSpan timeout);

 

public static TResult Invoke<TResult>(Activity<TResult> workflow, IDictionary<string, object> inputs, TimeSpan timeout);

 

public static IDictionary<string, object> Invoke(Activity workflow, IDictionary<string, object> inputs, TimeSpan timeout);

 

public static TResult Invoke<TResult>(Activity<TResult> workflow, IDictionary<string, object> inputs, out IDictionary<string, object> additionalOutputs, TimeSpan timeout);

 

例:得到有返回值Activity的返回值

流程

public sealed class addActivity :NativeActivity<int>

{

public InArgument<int> X { get; set; }

public InArgument<int> Y { get; set; }

 

protected override void Execute(NativeActivityContext context)

{

int x = X.Get(context);

int y = Y.Get(context);

 

context.SetValue(base.Result, x + y);

}

}

调用

static void staticCallActivityResult()

{

var p = new System.Collections.Generic.Dictionary<string, object> { { "X", 1 }, { "Y", 2 } };

 

int result = WorkflowInvoker.Invoke(new addActivity(), p);

 

System.Console.WriteLine(result);

 

}

结果

 

 

例:得到OutArgument

流程

调用

static void staticCallOutArgument()

{

var p = new System.Collections.Generic.Dictionary<string, object> { { "X", 3 }, { "Y", 4 } };

 

System.Collections.Generic.IDictionary<string, object> outArgument = WorkflowInvoker.Invoke(new testWorkflow(), p);

 

foreach (var item in outArgument)

{

System.Console.WriteLine(item);

}

 

}

结果

 

例:得到OutArgument与有返回值Activity的返回值

流程

public sealed class resultAndOutArgumentActivity : NativeActivity<int>

{

public InArgument<int> X { get; set; }

public InArgument<int> Y { get; set; }

public OutArgument<int> myValue { set; get; }

protected override void Execute(NativeActivityContext context)

{

int x = X.Get(context);

int y = Y.Get(context);

 

context.SetValue(base.Result, x + y);

context.SetValue(myValue, x + y);

}

}

调用

static void staticCallResultAndOutArgument()

{

var p = new System.Collections.Generic.Dictionary<string, object> { { "X", 5 }, { "Y", 6 } };

 

System.Collections.Generic.IDictionary<string, object> outArgument;

int result = WorkflowInvoker.Invoke(new resultAndOutArgumentActivity(), p,out outArgument,new TimeSpan(0));

 

System.Console.WriteLine(result);

 

foreach (var item in outArgument)

{

System.Console.WriteLine(item);

}

 

}

结果

 

 

 

 

 

WorkflowInvoker实例方式

WorkflowInvoker实例方式调用工作流时,有返回值Activity的返回值与OutArgument都由 System.Collections.Generic.Dictionary<string, object>集合返回

 

 

例:得到有返回值Activity的返回值

流程

public sealed class addActivity :NativeActivity<int>

{

public InArgument<int> X { get; set; }

public InArgument<int> Y { get; set; }

 

protected override void Execute(NativeActivityContext context)

{

int x = X.Get(context);

int y = Y.Get(context);

 

context.SetValue(base.Result, x + y);

}

}

调用

static void callActivityResult()

{

var p = new System.Collections.Generic.Dictionary<string, object> { { "X", 7 }, { "Y", 8 } };

 

WorkflowInvoker invoker = new WorkflowInvoker(new addActivity());

System.Collections.Generic.IDictionary<string, object> result = invoker.Invoke(p);

 

foreach (var item in result)

{

System.Console.WriteLine(item);

}

 

}

结果

 

 

例:得到OutArgument

流程

调用

static void callOutArgument()

{

var p = new System.Collections.Generic.Dictionary<string, object> { { "X", 9 }, { "Y", 10 } };

 

WorkflowInvoker invoker = new WorkflowInvoker(new testWorkflow());

 

System.Collections.Generic.IDictionary<string, object> outArgument = invoker.Invoke(p);

 

foreach (var item in outArgument)

{

System.Console.WriteLine(item);

}

}

结果

 

例:得到OutArgument与有返回值Activity的返回值

流程

public sealed class resultAndOutArgumentActivity : NativeActivity<int>

{

public InArgument<int> X { get; set; }

public InArgument<int> Y { get; set; }

public OutArgument<int> myValue { set; get; }

protected override void Execute(NativeActivityContext context)

{

int x = X.Get(context);

int y = Y.Get(context);

 

context.SetValue(base.Result, x + y);

context.SetValue(myValue, x + y);

}

}

调用

static void callResultAndOutArgument()

{

var p = new System.Collections.Generic.Dictionary<string, object> { { "X", 11 }, { "Y", 12 } };

 

WorkflowInvoker invoker = new WorkflowInvoker(new resultAndOutArgumentActivity());

 

System.Collections.Generic.IDictionary<string, object> outArgument;

 

outArgument = invoker.Invoke(p);

 

foreach (var item in outArgument)

{

System.Console.WriteLine(item);

}

 

}

结果

 

例:InvokeAsync方法与invokeCompleted事件

流程

public sealed class resultAndOutArgumentActivity : NativeActivity<int>

{

public InArgument<int> X { get; set; }

public InArgument<int> Y { get; set; }

public OutArgument<int> myValue { set; get; }

protected override void Execute(NativeActivityContext context)

{

int x = X.Get(context);

int y = Y.Get(context);

 

context.SetValue(base.Result, x + y);

context.SetValue(myValue, x + y);

}

}

调用

#region //async

static void async()

{

WorkflowInvoker myInvoker = new WorkflowInvoker(new resultAndOutArgumentActivity());

 

var p = new System.Collections.Generic.Dictionary<string, object> { { "X", 13 }, { "Y", 14 } };

 

myInvoker.InvokeCompleted += new EventHandler<InvokeCompletedEventArgs>(myInvoker_InvokeCompleted);

 

myInvoker.InvokeAsync(p);

 

}

 

static void myInvoker_InvokeCompleted(object sender, InvokeCompletedEventArgs e)

{

foreach (var item in e.Outputs)

{

System.Console.WriteLine(item);

}

}

#endregion

结果

 

例:BeginInvoke方法与EndInvoke方法

流程

public sealed class resultAndOutArgumentActivity : NativeActivity<int>

{

public InArgument<int> X { get; set; }

public InArgument<int> Y { get; set; }

public OutArgument<int> myValue { set; get; }

protected override void Execute(NativeActivityContext context)

{

int x = X.Get(context);

int y = Y.Get(context);

 

context.SetValue(base.Result, x + y);

context.SetValue(myValue, x + y);

}

}

调用

 

#region //begion end

static void beginEnd()

{

WorkflowInvoker myInvoker = new WorkflowInvoker(new resultAndOutArgumentActivity());

 

var p = new System.Collections.Generic.Dictionary<string, object> { { "X", 15 }, { "Y", 16 } };

 

IAsyncResult ir = myInvoker.BeginInvoke(p, new AsyncCallback(callback), myInvoker);

 

System.Collections.Generic.IDictionary<string, object> outArgument = myInvoker.EndInvoke(ir);

 

foreach (var item in outArgument)

{

System.Console.WriteLine(item);

}

 

}

static void callback(IAsyncResult asyncResult)

{

System.Threading.ManualResetEvent mr = asyncResult.AsyncWaitHandle as System.Threading.ManualResetEvent;

 

System.Console.WriteLine("callback");

}

 

#endregion

结果

 

例:使用跟踪

// WorkflowInvoker invoker = new WorkflowInvoker(new testWorkflow());

 

// invoker.Extensions.Add(myTracking);

 

// invoker.Invoke();

具体见[Tracking 跟踪]

 

相关文章:

  • Lotus开发点滴
  • cisco switch 配置(vlan划分,生成树和高级生成树,高级特性,vlan路由)
  • 三层交换机配置DHCP的解决方案
  • 1年12个月13个情人节????
  • 生活中的定律——80/20法则
  • 每一个社区成员,用你的努力为微软平台的开发技术添上一把柴!
  • 你的新年期望是什么?
  • 招聘网站设计项目数据库设计
  • 关于direct io
  • 【.Net Micro Framework PortingKit – 15】移植总结(兼谈MF未来发展)
  • Discuz论坛地图插件(通过自定义Discuz Code实现)
  • 博文批量发布工具新鲜出炉(支持wp、cnblogs等)
  • 程序中获取各种路径的方法及区别
  • asp.net mvc(八)
  • Windows的SEH机理简要介绍
  • ----------
  • 【附node操作实例】redis简明入门系列—字符串类型
  • cookie和session
  • C学习-枚举(九)
  • Django 博客开发教程 16 - 统计文章阅读量
  • httpie使用详解
  • javascript 哈希表
  • Java方法详解
  • JS笔记四:作用域、变量(函数)提升
  • k8s 面向应用开发者的基础命令
  • LintCode 31. partitionArray 数组划分
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 巧用 TypeScript (一)
  • 如何实现 font-size 的响应式
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 数据可视化之下发图实践
  • ​Spring Boot 分片上传文件
  • # Panda3d 碰撞检测系统介绍
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #14vue3生成表单并跳转到外部地址的方式
  • #HarmonyOS:软件安装window和mac预览Hello World
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (八)Flask之app.route装饰器函数的参数
  • (二)Linux——Linux常用指令
  • (三)终结任务
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (四)linux文件内容查看
  • (转)Unity3DUnity3D在android下调试
  • (转)我也是一只IT小小鸟
  • (转)详解PHP处理密码的几种方式
  • ./configure、make、make install 命令
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .net core 6 redis操作类
  • .Net core 6.0 升8.0
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .net的socket示例
  • .net分布式压力测试工具(Beetle.DT)
  • .NET企业级应用架构设计系列之应用服务器
  • .net中应用SQL缓存(实例使用)
  • @TableLogic注解说明,以及对增删改查的影响