首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VB.NET异步解析串行数据,将数据从共享函数获取到实例

VB.NET异步解析串行数据,将数据从共享函数获取到实例
EN

Stack Overflow用户
提问于 2011-01-24 11:32:50
回答 1查看 709关注 0票数 0

VB.NET 2010、.NET 4

你好,

我已经在这个逻辑上挣扎了一段时间,希望能有一点洞察力。

我正在开发一个应用程序,用于控制由连接到计算机的许多设备组成的工业机器。大多数情况下,这是合理的直截了当,但我有问题的思考RS-232设备。RS-232设备中的一种是一种具有多种功能的奇特电源。现在相关的是电压读取、电压写入、电流读取和电流写入。

我正在尝试实现的设计模式是这样一种设计模式,其中每个连接的设备都由一个对象表示,该对象具有读/写等方法和COM端口等属性。

对于这个电源,端口引用显然应该在实例之间共享,所以我有一个基类(比方说,PowerSupply)和一个受保护的共享属性Port作为IO.Ports.SerialPort。然后我有两个继承自这个类的类,PowerSupplyVoltage和PowerSupplyCurrent,每个类都定义了读/写方法和属性,用于保存最后读/写的值。

我的问题是使用共享SerialPort对象上的Port.DataRecieved事件解析来自电源的响应。电源使用的协议指定了它在每个响应包中发送的数据。因此,基本上,它可能会说等同于“电压是100V”或“电流是1A”或“电压已设置为150V”等。

我正在尝试在一个共享函数中解析它。只有在解析过程中,我才能确定要更新哪个实例的读/写值。我不能从共享函数中访问实例的读/写值属性。我的大脑在思考如何正确地做这件事时感到很痛苦。我能想到的最好的办法是创建某种PowerSupplyCommunicator对象,它将维护对PowerSupplyVoltage和PowerSupplyCurrent实例的引用,以及共享端口和DataRecievedHandler函数。不过,这看起来有点笨拙。有没有想过一种聪明的方法呢?

提前谢谢你,布赖恩

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-26 03:48:33

我建议让共享对象导出一个事件,每当参数消息通过串行端口时就会引发该事件。然后,各种对象实例可以订阅该事件,并根据需要进行自我更新。

这种方法的一个细微变化是,共享对象提供一个"register“方法,实例可以通过该方法提供一个委托,当有消息传入时,它们希望共享对象调用该委托。从概念上讲,这与事件非常相似,不同之处在于共享对象可以检查传入的消息,并且只调用它所指向的实例的委托。

第三种变化是让对象实例支持一个或多个接口,如INotifyVoltageChanged、INotifyCurrentChanged等,并调用共享对象中的某个方法来注册自己。

然而,在使用这些方法中的任何一种时,重要的是要注意,如果单个对象实例中的一个被放弃,共享对象可能会永远保留对它的引用。如果使用方法#3,则共享对象可以持有对象的WeakReference,而不是普通的(“强”)引用。这将略微减慢更新通知的处理速度,但将避免被放弃的对象永远存活的风险。当然,单个对象实例应该实现IDisposable,并且应该在释放时取消订阅任何通知,但除非使用弱引用,否则实际调用Dispose的命令性比许多其他类型的对象更强。请注意,除非使用弱引用,否则终结器将一文不值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4778359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档