我有一个c#Winforms应用程序,它从串口接收数据,然后处理它并显示在listview
上。
以100毫秒接收数据效果很好,但是当源传输速率更改为10毫秒时,应用程序会在一分钟或2分钟后挂起。
详细说明:
应用程序以字节为单位接收数据,因此我需要转换为字符串,存储在arraylist中并将其填充到listview列中,操作中涉及的转换很少:
我也使用正常的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
无法处理数据的速率吗?
任何有关应用程序以此速度挂起的建议?
答案 0 :(得分:3)
您应该在另一个Thread
,Task
或BackgroundWorker
中运行您的串行数据接收器。在那里,您不会直接填写ListView
。相反,您应该将其配置为使用VirtualMode
。可以找到有关如何使用VirtualMode
的示例at MSDN。
答案 1 :(得分:2)
我希望在插入每个项目后,listview会自行重绘。如果重绘比插入之间的间隔需要更长的时间,你会把它挂起来。当然,随着名单越来越长,情况会越来越糟。
您可以通过累积批量更新来修复它,并在插入批处理之前调用ListView.BeginUpdate(),并在插入批处理后调用ListView.EndUpdate()。