2012-05-11 8 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にパッケージし、それをキューに入れます。毎晩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; } 
    } 
} 
関連する問題