ListView-如何避免闪烁(.NET/C#)?

ListView-如何避免闪烁(.NET/C#)?,c#,.net,user-interface,components,C#,.net,User Interface,Components,我的应用程序是多线程的,它有f.ex25个活动线程,每个线程按委托将其状态推送到列表视图项 例如: private delegate void SetBackColorDelegate(int index, Color color); private void SetBackColor(int index, Color color) { if (listView1.InvokeRequired) { listVi

我的应用程序是多线程的,它有f.ex25个活动线程,每个线程按委托将其状态推送到列表视图项

例如:

    private delegate void SetBackColorDelegate(int index, Color color);
    private void SetBackColor(int index, Color color)
    {
        if (listView1.InvokeRequired)
        {
              listView1.Invoke(new SetBackColorDelegate(SetBackColor), new object[] { index, color });

        }
        else
        {
              listView1.Items[index].BackColor = color;
        }
    }
根据状态,它会改变物品的颜色等。它会闪烁很多,看起来非常讨厌:)


也许你可以建议如何避免这种情况?如何加速绘图?或者我应该考虑使用不同的组件,

考虑将每个线程都推到某个共享的数据结构,然后使用定时器从UI线程中查询每秒一次。这样:

  • 您不必担心从非UI线程调用
  • 你不会得到一个“忙碌”的用户界面
  • 你仍然可以合理地了解最新情况(而不是说“如果我最近已经更新了,就不要更新”)

就效率而言,我对UI计时器了解不多——这种计时器可能会相对昂贵,因此您可能需要进行一些跨线程通信:如果尚未启用计时器,则让每个非UI线程启用计时器,并在更新时禁用它。这样,您将始终落后于现实,但仍然是每秒只有一次状态更新。

我正在等待您对我的评论的回复。如果闪烁是一个双缓冲问题,那么接受的答案将让您上路。将您的listview设置为使用答案中的样式,这样做很好。这将导致性能损失,因为它将确保我们的更新只与显示器的刷新率同步(通常为每秒60次左右),但它会停止在显示器刷新之间进行更新时发生的闪烁/撕裂。

我想你的意思是闪烁。你能进一步说明一下这个问题吗?你有许多线程在更改项目的颜色,问题是颜色变化很大?你的意思是闪烁,像双缓冲区问题,还是你的颜色变化太大anges的执行速度不够快,而且它总是落后,总是在试图跟上时改变颜色?我不明白为什么代码要求更改项目的颜色,然后颜色改变是一个问题。是的,这很容易做到。但我需要即时状态;)这是个问题,我可以每一秒都这样做,但我不能听起来你有矛盾的要求:如果你需要立即更新一些东西,并且你有很多更新要显示,那么屏幕将显示所有这些更新,产生闪烁的效果。(如果这真的只是双缓冲,那么我误解了问题-哎呀。)谢谢:)这实际上帮助了我:)