2012-05-11 2 views
2

다른 스레드에서 내 listView의 "타이머"필드를 업데이트 중입니다. 그것은 잘 작동, 문제는 그냥 깜박입니다. 이것은 각 스레드가 갱신 될 필요가있을 때 (거의 매초마다) 호출하는 코드입니다.다른 스레드에서 매초마다 목록보기 업데이트

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

내 게시물을 제거 - 당신의 자식 컨트롤을 이중 버퍼링 할 수있는 방법에 스레드 SO 다음 체크 아웃 : http://stackoverflow.com/questions/76993/how-to-double-buffer-net-controls -on-a-form –

+0

고마워요. 감사합니다 :) – user1213488

답변

2

여기서는 Invoke을 사용하지 않겠습니다. 실제로 대부분의 경우 인터넷에서 읽을 수있는 내용에도 불구하고 일반적으로 좋은 옵션이 아닙니다. 대신, 스레드에 의해 생성되는 데이터를 POCO에 패키징하고 큐에 넣으십시오. 이벤트 처리기가 큐에서 항목을 끌어 와서 일괄 처리로 ListView을 업데이트하면 매초마다 System.Windows.Forms.Timer이 표시됩니다. 또한 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; } 
    } 
}