从不同的线程每秒更新列表视图

时间:2012-05-11 12:25:02

标签: c# multithreading listview

我正在从不同的线程更新listView中的“timer”字段。它工作正常,问题只是它闪烁。这是每个线程在需要更新时调用的代码(几乎每秒一次)。

    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();


                       }
                       ));
    }
谷歌搜索了一下甚至不确定我能让这个闪烁消失吗? :/

1 个答案:

答案 0 :(得分:2)

我不会在这里使用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; }
  }
}