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

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

本文例子下载:

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

 

本文例子说明

image.png

 

image.png

 


WorkflowInvoker


类名

System.Activitys.WorkflowInvoker

文件

System.Activities.dll

结构说明

继承 Object

是一个 sealed类

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

功能说明

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

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

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

 

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

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

 

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

 

image.png


WorkflowInvoker静态方式


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

 

public static IDictionary<stringobject> Invoke(Activity workflow);

 

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

 

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

 

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

 

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

 

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

 

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

 

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

流程

public sealed class addActivity :NativeActivity<int>

{

public InArgument<int> X { getset; }

public InArgument<int> Y { getset; }

 

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<stringobject> { { "X"1 }, { "Y"2 } };

 

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

 

System.Console.WriteLine(result);

 

}

结果

image.png

 

 

例:得到OutArgument

流程

image.png

调用

static void staticCallOutArgument()

{

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

 

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

 

foreach (var item in outArgument)

{

System.Console.WriteLine(item);

}

 

}

结果

image.png

 

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

流程

public sealed class resultAndOutArgumentActivity : NativeActivity<int>

{

public InArgument<int> X { getset; }

public InArgument<int> Y { getset; }

public OutArgument<int> myValue { setget; }

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<stringobject> { { "X"5 }, { "Y"6 } };

 

System.Collections.Generic.IDictionary<stringobject> 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);

}

 

}

结果

image.png

 

 

 

 

 


WorkflowInvoker实例方式


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


 

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

流程

public sealed class addActivity :NativeActivity<int>

{

public InArgument<int> X { getset; }

public InArgument<int> Y { getset; }

 

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<stringobject> { { "X"7 }, { "Y"8 } };

 

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

System.Collections.Generic.IDictionary<stringobject> result = invoker.Invoke(p);

 

foreach (var item in result)

{

System.Console.WriteLine(item);

}

 

}

结果

image.png

 

 

例:得到OutArgument

流程

image.png

调用

static void callOutArgument()

{

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

 

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

 

System.Collections.Generic.IDictionary<stringobject> outArgument = invoker.Invoke(p);

 

foreach (var item in outArgument)

{

System.Console.WriteLine(item);

}

}

结果

image.png

 

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

流程

public sealed class resultAndOutArgumentActivity : NativeActivity<int>

{

public InArgument<int> X { getset; }

public InArgument<int> Y { getset; }

public OutArgument<int> myValue { setget; }

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<stringobject> { { "X"11 }, { "Y"12 } };

 

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

 

System.Collections.Generic.IDictionary<stringobject> outArgument;

 

outArgument = invoker.Invoke(p);

 

foreach (var item in outArgument)

{

System.Console.WriteLine(item);

}

 

}

结果

image.png

 

例:InvokeAsync方法与invokeCompleted事件

流程

public sealed class resultAndOutArgumentActivity : NativeActivity<int>

{

public InArgument<int> X { getset; }

public InArgument<int> Y { getset; }

public OutArgument<int> myValue { setget; }

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<stringobject> { { "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

结果

image.png

 

例:BeginInvoke方法与EndInvoke方法

流程

public sealed class resultAndOutArgumentActivity : NativeActivity<int>

{

public InArgument<int> X { getset; }

public InArgument<int> Y { getset; }

public OutArgument<int> myValue { setget; }

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<stringobject> { { "X"15 }, { "Y"16 } };

 

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

 

System.Collections.Generic.IDictionary<stringobject> 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

结果

image.png

 

例:使用跟踪

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

 

// invoker.Extensions.Add(myTracking);

 

// invoker.Invoke();

具体见[Tracking 跟踪]

 

转载自:

https://www.cnblogs.com/foundation/archive/2010/01/27/1657414.html


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2025年4月    »
123456
78910111213
14151617181920
21222324252627
282930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864