You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 18:43:27