WinForms中TreeListView高频更新阻塞UI线程问题求助
问题描述
我开发了一个WinForms应用,使用TreeListView展示CAN消息数据,设置为检测到新CAN消息后立即更新TreeListView。应用采用TabControl作为主导航,用于切换不同CAN消息处理功能模块。
切换至TreeListView所在标签页时出现异常:当CAN消息以约10ms间隔传入时,TreeListView能正常绘制和更新,但其他所有控件完全无法绘制,且无法交互;TabControl之前显示的标签页内容会残留,TreeListView覆盖在旧内容之上,旧内容虽可见但无法进行任何操作。
已尝试的解决方案
- 切换到该标签页时短暂停止CAN消息处理,让UI线程完成其他控件的绘制。此方法能让控件正常显示,但控件仍无法交互,无法点击按钮或进行选择操作。
当前架构
- 后台线程负责检测新消息,检测到后触发事件进行处理
- 数据处理在独立线程中完成,最终将处理后的数据推送至UI线程更新界面
此前使用普通ListView时未出现任何此类问题,仅在切换为TreeListView后才出现故障。
相关代码片段
string sFullPGN = data.completePGN; if (sTxtBoxPGNDisplay == sFullPGN) txtBoxTxInfo.Text = getRxTooltip(ref data); if (CAN_PGNS.Contains(sFullPGN)) { int index = GetAdapterIndex(sFullPGN); if (index != -1) { Adapters[index].UpdateAdapterData(data); if (Adapters[index].Children != null) // Does the PGN contain any signals? foreach(CANAdapter signal in Adapters[index].Children) { signal.UpdateChild(data); } // RefreshObject gives an error if a filter is applied, complains about index error since ObjectListView uses it own internal display list // which is changed when a filter is applied. The All objects list's index is then taken directly instead of being adapted to the // display list's matching showing index. This is all internal code of the ObjectListView and cannot be changed by us. // See line btnCHfilter_click below. //tlvCANIn.RefreshObject(Adapters[index]); try { tlvCANIn.RefreshObject(Adapters[index]); } catch {} } } else { CANAdapter newAdapter = new CANAdapter(sFullPGN); CanMessageInfo newMessage = new CanMessageInfo(); newMessage = CANMessagesInfo.GetMessage(data.PGN_RBDP); newAdapter.UpdateAdapterData(data); if (newMessage != null) { newAdapter.comment = newMessage.name + " " + newMessage.comment; if (newMessage.signals.Count > 0) { newAdapter.HasSPNs = true; newAdapter.InitialiseChildren(newMessage.signals); } else { newAdapter.HasSPNs = false; } } Adapters.Add(newAdapter); CAN_PGNS.Add(sFullPGN); }
内容的提问来源于stack exchange,提问作者Christiaan Retief
相关产品推荐
相关产品推荐

