2012-05-11 18 views
2

我正在更新我的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(); 


         } 
         )); 
    } 

已經谷歌搜索了一下我甚至不知道我可以讓這個閃爍消失嗎? :/

+0

刪除我的帖子 - 查看所以下面線程的方式來雙緩衝你的子控件:http://stackoverflow.com/questions/76993/how-to-double-buffer-net-controls -on-a-form –

+0

感謝人欣賞它:) – user1213488

回答

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; } 
    } 
}