我在winform中有一个列表视图,其中列表视图在新消息即将到来时滚动到列表中的最后一项。我的问题是,当消息在我的客户端中如此迅速时,我的系统很慢,并且在一段时间内没有响应,而我的鼠标箭头则将形状更改为车轮。
示例示例:
for (int i = 1; i < 10000; i++) {
listView1.BeginUpdate();
listView1.Items.Add(a);
listView1.EnsureVisible(listView1.Items.Count - 1);
listView1.EndUpdate();
}
真实情况我的客户端
当新消息传来时,此功能是从线程调用的。我的克林特代码很大,我只显示此代码,因为此代码用于在列表视图中显示消息。
当我们评论滚动线时,当我们滚动到最后一条消息时,系统性能良好,并且当消息传来 12,000 时,它会降低速度。
private void HandleNewMsg(string msg)
{
if(chkAppend.Checked)
{
if (this.InvokeRequired)
{
this.BeginInvoke(new AppendTextDelegate(HandleNewMsg), new object[] { msg });
}
else
{
// call here to parse the message
ShowMessage(ParseMessage(msg));
}
}
}
和显示消息方法
private void ShowMessage(List<String>MsgReceived){
listview1.BeginUpdate();
foreach(var i in MsgReceived)
{
listview1.Items.Add(i);
}
listView1.EnsureVisible(listView1.Items.Count - 1);
listview1.EndUpdate();
}
和parsemessage是
private List<String> ParseMessage(String Message){
List<String> msg=new List<String>();
msg.Add(Message.Substring(0, 13));// title such as msg received
msg.Add("Msg Type " + Message.Substring(41+13 , 4));
msg.Add("p Code " + Message.Substring(65 +13, 2));
msg.Add("*************");
// and other data in it .
return msg;
}
如何使其不悬挂并滚动到最后一条消息?
您应该阅读BeginUpdate
和EndUpdate
的手册。
为了正确使用它们,您应该以以下方式编写:
listView1.BeginUpdate();
for (int i = 1; i < 10000; i++)
{
listView1.Items.Add(a);
}
listView1.EndUpdate();
listView1.EnsureVisible(listView1.Items.Count - 1);
这应该添加10000个项目,然后滚动到最后一个。
在BeginUpdate
和EndUpdate
之间,ListView
不会渲染新添加的项目,因此在添加大量项目时不会滞后。
添加和渲染后,然后滚动到最后一个。
您所做的是冗余地渲染添加的项目,然后确保其可见性 - 又导致了渲染。这就是您申请开始滞后的原因。