C#使用委托与多线程,解决界面假死


.NET Framework 为我们提供了一个处理控件闪烁的方案-双缓冲,我们可以直接调用它。

  • 首先自己封装一个Windows组件 MyListView.cs,并让它继承自Listview。

  • 在控件中添加打开双缓冲的代码如下:

public MyListView()
{
// 打开控件的双缓冲
SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
}

  • 使用我们封装的MyListview 实例化一个对象,命名为ImageListView, 执行下面的方法来实现异步数据加载

  • private void button1_Click(object sender, EventArgs e)
    {
    Thread ImageThread = new Thread((ThreadStart)(delegate()
    {
    for (int i = 0; i<100000; i++)
    {
    // 此处应该警惕值类型装箱造成的”性能陷阱”
    ImageListView.Invoke((MethodInvoker)delegate()
    {
    ImageListView.Items.Add(new ListViewItem(……) );
    });
    }
    }));

    ImageThread.Start();
    }

    使用这种方法可以有效的解决加载大量数据的时候造成的界面假死。