c#winform程序,做CAN通信项目,数据量很大,我写了一个CANHelper类,在这个类里定义了一个委托事件,在form.cs中注册了这个事件,当有CAN数据到来时,form类中的事件就会处理数据,处理好后,将数据显示到指定的listview某行某列中,但是,经测试,给listview赋值时太慢了,就导致了CAN缓存中存了大量的数据,导致数据显示不及时,请问高手们,这种情况如何处理?
if (monitorParameter[i].DataType == "bit")
{
int bitaddr = Convert.ToInt32(monitorParameter[i].bitAddr);
str = DecimalConvert.HexStringToBinString(item.Data.Substring(byteaddr * 2, 2));
string[] strReverse = ReverseString(str);
strData = (Convert.ToInt32(strReverse[bitaddr]) * resolution) + offset; if ((strData > valueMax) || (strData < valueMin))
{
AddDataToListView(listView1, i, 4, strData.ToString("F0"), Color.Red, 1);
}
else
{
AddDataToListView(listView1, i, 4, strData.ToString("F0"), Color.White, 0);
}
AddDataToListView(listView1, i, 2, item.Data.Substring(byteaddr * 2, 2), Color.White, 0);
}
if (monitorParameter[i].DataType == "bit")
{
int bitaddr = Convert.ToInt32(monitorParameter[i].bitAddr);
str = DecimalConvert.HexStringToBinString(item.Data.Substring(byteaddr * 2, 2));
string[] strReverse = ReverseString(str);
strData = (Convert.ToInt32(strReverse[bitaddr]) * resolution) + offset; if ((strData > valueMax) || (strData < valueMin))
{
AddDataToListView(listView1, i, 4, strData.ToString("F0"), Color.Red, 1);
}
else
{
AddDataToListView(listView1, i, 4, strData.ToString("F0"), Color.White, 0);
}
AddDataToListView(listView1, i, 2, item.Data.Substring(byteaddr * 2, 2), Color.White, 0);
}
我没有贴出来,在AddDataToListView方法里的这条语句耗时,是不是我赋值方式有问题?
更新ui,用begininvoke足够了。如果还卡,那就是更新频率过高了。更新频率过高没有意义,人眼识别不出来。最简单的方式,就是把更新频率降下来。
对dataCollection 赋值,
ListView.DataSource = dataCollection ;
需要对ListView的显示格式进行下设置
而且更新几十条要多少时间……RetrieveVirtualItem里面主要的工作就是string.format。你就算每秒刷新个上百次,加个CacheVirtualItems也能搞定。