Winforms应用程序在以毫秒为单位接收数据时挂起

时间:2012-12-14 08:39:31

标签: c# winforms listview hang

我有一个c#Winforms应用程序,它从串口接收数据,然后处理它并显示在listview上。

以100毫秒接收数据效果很好,但是当源传输速率更改为10毫秒时,应用程序会在一分钟或2分钟后挂起。

详细说明:

应用程序以字节为单位接收数据,因此我需要转换为字符串,存储在arraylist中并将其填充到listview列中,操作中涉及的转换很少:

  1. 字节到字符串
  2. 很少将转换字符串转换为整数。
  3. 我也使用正常的listview代码,如下所示:

    ListViewItem item = new ListViewItem(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.ffff"));
    item.SubItems.Add(hex1.ToString());
    item.SubItems.Add(hex2.ToString());
    
    .....
    
    listView1.Items.Add(item);
    

    所以我不确定什么是错的。是listview无法处理数据的速率吗?

    任何有关应用程序以此速度挂起的建议?

2 个答案:

答案 0 :(得分:3)

您应该在另一个ThreadTaskBackgroundWorker中运行您的串行数据接收器。在那里,您不会直接填写ListView。相反,您应该将其配置为使用VirtualMode。可以找到有关如何使用VirtualMode的示例at MSDN

答案 1 :(得分:2)

我希望在插入每个项目后,listview会自行重绘。如果重绘比插入之间的间隔需要更长的时间,你会把它挂起来。当然,随着名单越来越长,情况会越来越糟。

您可以通过累积批量更新来修复它,并在插入批处理之前调用ListView.BeginUpdate(),并在插入批处理后调用ListView.EndUpdate()。