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


                       }
                       ));
    }

グーグルで少しイムをしたので、このちらつきをなくすことができるかどうかさえわかりませんか?:/

4

1 に答える 1

2

ここでは使いませんInvoke。実際、ほとんどの場合、インターネットで何を読んでも、それは通常、優れたオプションではありません。代わりに、スレッドによって生成されているデータをPOCOにパッケージ化し、キューに入れます。イベントハンドラーがキューからアイテムを引き出してバッチでSystem.Windows.Forms.Timer更新することで、毎秒チェックマークを付けます。ListViewまた、DoubleBufferedtrueに設定してみてください。これらの提案はいくつかの助けになるはずです。

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; }
  }
}
于 2012-05-11T12:47:50.757 に答える