双缓冲队列解决WPF界面卡死
工作中的项目,CS客户端会通过MQ接收前端设备发送的信息,之前测试的时候,由于测试的数据不大,没有进行压力测试,软件可以正常工作,随着项目现场设备数量的增加,CS客户端从MQ中订阅的数据量不断增加,最终导致,客户端界面卡死。原来的数据流程图如下:
这个数据流程,在数据不大的情况下,是没有什么问题,数据太多,从mq获取数据的流程太长,不管是Json反序列化,还是WPF界面渲染,都是耗时比较大。所以决定将数据流程改为如下所示:
修改后的方案,将原来的一个流程拆分两个流程,左边的流程只负责从mq取数据的流程,少了原来中间的Json反序列化和界面渲染的流程,提高了取数据的能力;右边的流程是ViewModel层主动定时从缓存队列取数据的流程,这里面根据业务的实际场景,根据订阅的设备,每个设备最多取界面能够显示的最大数量,这样就很好地解决了界面卡死的问题,不管前端设备上传了多少数据,实际客户端显示的数据最多是一定的,订阅设备的数量 X 界面最大显示的数量。