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

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

    原创文章,请阅读页脚的许可方式,转载请注明: 转载自王恒的博客 [ https://wangheng.org ]

    本文链接地址: https://wangheng.org/?p=94219

    1条评论 在“C#使用委托与多线程,解决界面假死”

    1. […] C#使用委托与多线程,解决界面假死http://wangheng.org/use-multiple-threads-resolve-interface-feign-death.html 谢谢各位大虾!!!俺上网查资料学会了异步相应!现在的界面好看多了,不会假死!! 未分类.NET技术, c, 俺最近学C, 写了一个文件下载器, 可是在下载, 时候画面又恢复正常, 有何高招呢大家, 直到下载差不多, 过程中程序往往一直卡住 ← 问一个日期比较的问题,求帮忙~~~ – .NET技术 / ASP.NET 怎么注册Shockwave Flash Object控件 在线等 – .NET技术 / C# → 发表评论?0 条评论。 […]

    给我留言

    *

    *