细节:关于异步调用的解决方案

LabVIEW中异步调用详解 动态调用子VI中有一个重要方式就是异步调用,异步调用在工程实际中有非常重要的用途,下面进行详细讲解。 阅读详情

收集于双鱼座

Net66曾发表过一篇《衔接UI线程和管理后台工作线程的类(多线程、异步调用)》

来说明如何处理后台线程通过异步方式来更新UI。他的方案非常棒,但是客户端稍稍复杂了一点,在非常复杂的场景可能会发生问题。我在实际工作中遇到这个问题的时候不是以异步委托的面目出现的,而是以接口方式实现的,这样的情况更具有一般性。我通常是在若干个订阅端(Subscriber)实现这个“订阅主题”的接口,在一个发布端(Publisher)实现同样一个接口,并提供对订阅者的管理。事实上,在业务层实现这个发布端的接口是容易的,但在GUI的订阅端有可能会发生另外一些问题,例如如果业务端与GUI客户端并不在同一个线程中。典型的例子就是通常将“长任务”放到某个后台线程中去执行,在执行过程中可以在任何时候将执行状态报告给前台线程。显然,这是一个处理一般性Observe模式的通用方案。

 

实现的方法有点变态,和Mixin的原理很相似。在一个AsyncObjectBase的基类或者该基类的派生类上动态实现客户端接口,同时实现对订阅者的管理。之所以动态化是为了适应客户端接口中的任何签名的方法。

 

以下是关于AsyncObjectBase的简单的API:

提供了两个方法来管理订阅者:

Register(object):添加订阅者。

Unregister(object):删除订阅者。

提供了三个方法来管理发布状态:

Disable():关闭发布。

Enable(object):仅开放指定的订阅者。

Enable():开放所有的订阅者。

提供了两个静态方法来实例化接口的服务端实现:

AsyncObjectBase GetObject(Type, Type):获取指定基类、指定接口类型的服务端实现(指定基类必须继承自AsyncObjectBase)。

AsyncObjectBase GetObject(Type):获取指定接口类型的服务端实现。

 

从AsyncObjectBase派生一个自定义类型来重写委托指派方法可实现复杂的委托(不仅限于基于System.Windows.Form.Control的实现类)。这三个方法是:

void CheckDelegate(Delegate, object[], out bool);

object ChecjDelegate2(Delegate, object[], out bool);

以上两个方法都是捕获委托的,差异是前者实现的委托无返回值,而后者实现的委托有返回值。最后一个参数通知服务器该委托是否已经被捕获,以决定是否需要继续raise这个委托。这是本方案加入自定义委托捕获的唯一途径。

bool GetEnabled(object):返回是否需要向指定委托者发布。

 

示例实现这样一个场景:后台线程打开一个文本文件,然后一段一段地向多个订阅者发布。

 

有两点需要说明:

一、示例未实现多接口,当然如果需要的话,改造过程非常简单。

二、未处理带返回值的方法的接口,当然如果需要的话,改造过程也非常简单。

示例下载

 
Labview异步调用示例 异步调用示例,Labview异步调用示例 立即下载

相关推荐

LabVIEW中异步调用+可重入VI设置

LabVIEW中异步调用+可重入VI设置

LabVIEW-VI引用(及严格类型),异步调用VI的多个实例实现并行执行

LabVIEW利用VI引用(以及严格类型VI引用)控制读写另一VI的控件

weixin_48437703的博客 5823

Labview2015多线程异步调用工程

labview2015关于异步调用功能的研究工程,主要用于解决主线程负责快速轮询,多个子线程负责具体的任务处理并反馈给主线程(子线程需要长时间处理任务),解决单纯的可重复VI不能实现并行的功能。

LabVIEW异步调用VI

如将异步选项标识作为“打开VI引用”函数选项输入端的一部分,将VI引用所指的VI异步运行,LabVIEW将创建一个数据空间的池,跟踪对VI的各个调用。如要收集异步VI调用的结果,必须将被调用VI的引用传递至“等待异步调用”节点。因为“等待异步调用”节点接收VI的引用,而不是特定数据空间的引用,节点无法收集特定VI调用的输出。(可选)获取异步VI调用的结果—如应用程序需要异步调用的子VI的输出结果,将VI引用连接至等待异步调用节点以收集结果。调用和收集—调用方VI开始调用子VI,稍后收集子VI的执行结果。..

bjcyck的博客 3316

LabVIEW中异步调用范例集锦

LabVIEW中异步调用范例集锦

一种导弹追踪算法的MATLAB仿真实现

以下是一个用于模拟机动变轨导弹和防空导弹追踪过程的 MATLAB 代码,同时会提供 3D 效果展示。你可以运行这段代码,从而观察机动变轨导弹和防空导弹的速度与位置变化。

SmartGridequation的博客 933
上一篇: 多线程
下一篇: CLR团队精品系列第一期:不止是起点
vainnetwork
博客等级 码龄20年 17粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值