每秒从不同的线程更新列表视图
本文关键字:线程 更新 列表 视图 | 更新日期: 2023-09-27 18:34:03
我正在从不同的线程更新列表中查看的"计时器"字段。它工作正常,问题只是它闪烁。这是每个线程在需要更新时(几乎每秒)调用的代码。
private void AddToListView(string user, string status, string proxy, int number)
{
Invoke(new MethodInvoker(
delegate
{
listView1.BeginUpdate();
this.listView1.Items[number].SubItems[1].Text = status;
listView1.EndUpdate();
}
));
}
谷歌了一下,我什至不确定我能让这种闪烁消失吗? :/
我不会在这里使用Invoke
。事实上,在大多数情况下,尽管您可能会在互联网上阅读内容,但通常不是一个不错的选择。相反,将线程生成的数据打包到 POCO 中,并将其放入队列中。每秒进行一次System.Windows.Forms.Timer
滴答,事件处理程序将项目从队列中提取出来以批量更新ListView
。此外,请尝试将DoubleBuffered
设置为 true。这些建议应该对一些人有所帮助。
public class YourForm : Form
{
private ConcurrentQueue<UpdateInfo> queue = new ConcurrentQueue<UpdateInfo>();
private void YourTimer_Tick(object sender, EventArgs args)
{
UpdateInfo value;
listView1.BeginUpdate();
while (queue.TryDequeue(out value)
{
this.listView1.Items[value.Number].SubItems[1].Text = value.Status;
}
listView1.EndUpdate();
}
private void SomeThread()
{
while (true)
{
UpdateInfo value = GetUpdateInfo();
queue.Enqueue(value);
}
}
private class UpdateInfo
{
public string User { get; set; }
public string Status { get; set; }
public string Proxy { get; set; }
public int Number { get; set; }
}
}