WF3.0 CallExternalMethod使用技巧
CallExternalMethod用于工作流向宿主进程中通信 简单的介绍一下它的使用技巧,参照网上的一个questioner源码进行了改进,因为我感觉这个源码提供的通信demo过于繁琐。

看看service代码
namespace QuestionService
{
[ExternalDataExchange]
public interface ITestService
{
void SendResponseDataToHost(TestPara responses);
}
}
TestPara对象是对参数的一个封装,因为按照我的测试,在调用接口方法中,方法的参数如果不是对象类型,就会无法解决工作流传参的问题。
namespace QuestionService
{
[Serializable]
public class TestArgs : ExternalDataEventArgs
{
protected TestPara _dataValue = null;
public TestPara Responses
{
get { return _dataValue; }
}
public TestArgs(Guid instanceId, TestPara responses)
: base(instanceId)
{
_dataValue = responses;
}
}
[Serializable]
public class TestPara
{
protected bool[] _dataValue = null;
public bool[] Responses
{
get { return _dataValue; }
set { _dataValue = value; }
}
}
}
这是实现的关键地方,DataAvailable事件用于向宿主进程暴露
namespace QuestionService
{
[Serializable]
public class TestService : ITestService
{
#region ITestService 成员
public event EventHandler<TestArgs> DataAvailable;
public void SendResponseDataToHost(TestPara responses)
{
if (DataAvailable != null)
{
try
{
DataAvailable(this, new TestArgs(WorkflowEnvironment.WorkflowInstanceId, responses));
}
catch (Exception ex)
{
}
} // if
}
#endregion
}
}
在工作流中 要设置相关的接口协议,选择调用的方法

需要注意的是 参数要在工作流中设置参数的属性 以供其选择,其中_response是工作流活动返回的数据,这里通过TestPara属性进行封装获取
private bool[] _response = null;
private TestPara _TestPara = new TestPara();
public TestPara TestPara
{
get {
_TestPara.Responses = _response;
return _TestPara;
}
}
最后是宿主调用的过程 对调用进行了改动 DataAvailable事件暴露给宿主进程。以供工作流进程调用。
private void cmdExecute_Click(object sender, EventArgs e)
{
// Disable the execute button
cmdExecute.Enabled = false;
// Clear the indicators
ClearIndicators();
// Set the cursor to "app starting"
Cursor = Cursors.AppStarting;
// Process the request, starting by creating the parameters
Dictionary<string, object> parms = new Dictionary<string, object>();
parms.Add();
];
questions[] = tbQuestion1.Text;
questions[] = tbQuestion2.Text;
questions[] = tbQuestion3.Text;
parms.Add("Questions", questions);
// Create instance.
_workflowInstance = _workflowRuntime.CreateWorkflow(typeof(QuestionFlow.Workflow1), parms);
if (_dataExchangeService==null)
{
_dataExchangeService = new ExternalDataExchangeService();
_workflowRuntime.AddService(_dataExchangeService);
TestService _testService = new TestService();
_testService.DataAvailable += new EventHandler<QuestionService.TestArgs>(dataService_DataAvailable);
_dataExchangeService.AddService(_testService);
}
// Hook returned data event
//QuestionService.WorkflowResponseDataService dataService = QuestionService.WorkflowResponseDataService.CreateDataService(_workflowInstance.InstanceId, _workflowRuntime);
// Start instance.
_workflowInstance.Start();
}
public void dataService_DataAvailable(object sender, QuestionService.TestArgs e)
{
IAsyncResult result = this.BeginInvoke(
new EventHandler(
delegate
{
// Retrieve connection.
//QuestionService.WorkflowResponseDataService dataService = QuestionService.WorkflowResponseDataService.GetRegisteredWorkflowDataService(e.InstanceId);
// Read the response data
bool[] responses = e.Responses.Responses;
// Bind the vehicles list to the vehicles table
SetIndicators(responses);
} // delegate
), null, null
); // BeginInvoke
this.EndInvoke(result);
// Reset for next request
WorkflowCompleted();
}
private delegate void WorkflowCompletedDelegate();
private void WorkflowCompleted()
{
IAsyncResult result = this.BeginInvoke(
new EventHandler(
delegate
{
// Reset the cursor
Cursor = Cursors.Arrow;
// Enable the execute button
cmdExecute.Enabled = true;
} // delegate
), null, null
); // BeginInvoke
this.EndInvoke(result);
}
WF3.0 CallExternalMethod使用技巧的更多相关文章
- VC6.0实用小技巧
VC6.0的若干实用小技巧 .检测程序中的括号是否匹配 把光标移动到需要检测的括号(如大括号{}.方括号[].圆括号()和尖括号<>)前面,键入快捷键 “Ctrl+]”.如果括号匹配正确, ...
- nyoj--84--阶乘的0(数学技巧)
阶乘的0 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 计算n!的十进制表示最后有多少个0 输入 第一行输入一个整数N表示测试数据的组数(1<=N<=100 ...
- 0.0.Pycharm使用技巧
调整自动字体大小 Increase(字体变大) Decrease(字体变小) 背景颜色设置 pycharm 左侧菜单问题 解决 pycharm中配置启动Django项目 1.先打开mange.py,然 ...
- arcgis中nodata设为0及其小技巧
一.arcgis中nodata设为0 两个栅格进行叠加,有时会有一部分没有数据,即用identify点击该区域,Value为NoDat a,而不是像其他非空区域一样有值. 此时注意nodata区域要赋 ...
- Android 4.0的图形硬件加速及绘制技巧
转:http://zuiniuwang.blog.51cto.com/3709988/721798 从Android 3.0开始,Android 2D的绘制流程就设计为能够更好地支持硬件加速.使用GP ...
- 前端读者 | 关于存储及CSS的一些技巧
@羯瑞 HTML5存储 cookies 大小限制4K 发送在http请求头中 子域名能读取主域名的cookies 本地存储 localStorage sessionStorage 大小限制5M(注意超 ...
- cssfloat布局以及其他小技巧
css float 布局以及其他小技巧总结 这篇博文 前面四个部分是关于css 经典布局 如果你已经知道了 可以直接跳过看第六部分 css 的其他小技巧 1.0 左右居中布局 <!DOCTYPE ...
- TensorFlow2.0使用方法
TensorFlow2.0 1 使用技巧 更新到最新版本: pip install --upgrade tensorflow pip install --upgrade tensorflow-gpu ...
- 利用Shell脚本将MySQL表中的数据转化为json格式
脚本如下: #!/bin/bash mysql -s -phello test >.log <<EOF desc t1; EOF lines="concat_ws(',', ...
随机推荐
- Codeforce Round #215 Div2 C
还以为就这么点分了,不会跪了,起码有点加,生活都这么艰难了,为什么不让我好好地活下去! 是不是世界对我充满了恶意! 当然还是自己太菜! B题没初始化第一个就杯具了一次 C题大概的弄出来了,调了半个小时 ...
- 【Origin】 碑铭
快意人生潇洒过, 飘渺岁月不留痕: 他朝墓穴成青冢, 宁不留名念此生. -作于二零一五年六月十日
- FAQ: c++ 函数名后添加 const void function1(int &id) const
说明这个函数不能修改这个类的成员变量!只能操作自己的参数和内部的范围变量! 括号内的&id,&表示这个变量和C# in和out是一样的,算是一个reference,可以更改值,要想不更 ...
- yii添加行的增删改查
效果图: 控制器: <?phpnamespace backend\controllers;use Yii;use yii\web\Controller;use backend\models\Zh ...
- bzoj4216 Pig
水题,题目难点大概就是空间限制上了,开longlong会爆,可以开个int数组求前缀和,然后一旦绝对值超过20亿,则将其取模,并记录下当前位置,这样询问时就可以二分这些超过的位置,将其乘以20亿后加上 ...
- 深度解析 Java 内存原型
一.Java 虚拟机内存原型 寄存器:我们在程序中无法控制. 栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在 堆中. 堆:存放用 new 产生的数据. 静态域:存放在对象中用 ...
- PHP XDEBUG
PHP调试时,不得不提XDEBUG这个调试利器.学习PHP以来,几乎所有的问题我都利用它来解决. 首先关于如何安装,不在赘述,请自行google之.(需要特别注意的是:PHP5.2 和5.3 ,关于加 ...
- 3D语音天气球(源码分享)——在Unity中使用Android语音服务
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 开篇废话: 这个项目准备分四部分介绍: 一:创建可旋转的"3D球":3 ...
- asp上传图片提示 ADODB.Stream 错误 '800a0bbc'的解决方法
asp上传图片提示 ADODB.Stream 错误 '800a0bbc' 有这个提示有很多问题导致.权限是常见一种.这个不多说,还有一个有点怪的就是 windows2008显示系统时间的格式竟然是:2 ...
- Verilog中的specify block和timing check
在ASIC设计中,有两种HDL construct来描述delay信息: 1)Distributed delays:通过specify event经过gates和nets的time,来描述delay; ...