【C#利用后台动态加载数据】Winform“防界面卡死”
来源:互联网 发布:51单片机usb串口 编辑:程序博客网 时间:2024/05/02 21:52
废话:最近遇到的项目发现,对于Winform获取大数据量时,界面假死,体验效果非常差。身为测试员,有义务也有责任提出BUG。每次测试都面对卡了超过5秒的界面,实在是一种折磨,更是一种自杀行为。与是自己便研究了下,可以通过多线程来处理,当然也可以通过后台来获取数据。如果用多线程的话可以解决界面卡死的情况,但是对于动态加载数据的话可能复杂些。因为多线程的话,需要执行完一个线程再把数据更新出来,智能化不够高。使用后台的话,可以随时报告获取的数据,能够精确到某一条,而且使用起来很方便,因为是已经封装好了的。
所使用的类:using System.ComponentModel下的BackgroundWorker ;
该类下有四个重要的方法:DoWork、ProgressChanged、RunWorkerCompleted、RunWorkerAsync,两个重要的属性WorkerSupportsCancellation、WorkerReportsProgress
方法:
1.DoWork:意思就是利用后台具体做什么,绑定时间时传入的参数是方法名
2.ProgressChanged:进度发生变化时后台该做什么,绑定时间时传入的参数是方法名
3.RunWorkerCompleted:后台工作完后该做什么,绑定时间时传入的参数是方法名
4.RunWorkerAsync:启用后台,后台开始运行
属性:
1.WorkerSupportsCancellation:是否支持异步取消
2.WorkerReportsProgress:是否报告进度更新,这个属性很重要,必须启用才能对进度进行报告
下面进入后台动态加载数据的例子:
我们先做一个简单的界面如图:
1 public void Add(object sender, DoWorkEventArgs e) 2 { 3 DirectoryInfo di = new DirectoryInfo(@"C:/"); 4 foreach (FileInfo item in di.GetFiles()) 5 { 6 ListViewItem lvt = new ListViewItem();//用listviewItem来存储获取到文件的信息 7 lvt.Text = item.FullName; 8 lvt.SubItems.Add(DateTime.Now.ToLongTimeString()); 9 Thread.Sleep(500);10 Bw.ReportProgress(listView1.Items.Count,lvt);//把当前的进度报告出去,获取到第几个文件和该文件的信息11 }12 13 }
1 public void Progress(object sender, ProgressChangedEventArgs e)2 {3 progressBar1.Value = e.ProgressPercentage;//获取第几个文件,用来改变进度条的进度4 ListViewItem lv = e.UserState as ListViewItem;5 listView1.Items.Add(lv);//把最新获取到的文件信息添加到listview6 }
1 public void End(object sender, AsyncCompletedEventArgs e)2 {3 progressBar1.Value = 0;//进度条清04 }
1 private void button1_Click(object sender, EventArgs e) 2 { 3 DirectoryInfo di = new DirectoryInfo(@"C:/"); 4 FileInfo[] fi = di.GetFiles(); 5 progressBar1.Maximum = fi.Length - 1;//设置进度条的最大值 6 Bw.WorkerSupportsCancellation = true; 7 Bw.WorkerReportsProgress = true; 8 Bw.DoWork += new DoWorkEventHandler(Add);//绑定事件 9 Bw.ProgressChanged += new ProgressChangedEventHandler(Progress);10 Bw.RunWorkerCompleted+=new RunWorkerCompletedEventHandler(End);11 Bw.RunWorkerAsync();12 }
下载地址:http://files.cnblogs.com/Zeech-Lee/%E5%90%8E%E5%8F%B0%E6%93%8D%E4%BD%9C.rar
- 【C#利用后台动态加载数据】Winform“防界面卡死”
- 【C#利用后台动态加载数据】Winform“防界面卡死”
- 【C#利用后台动态加载数据】Winform“防界面卡死”
- 【C#利用后台动态加载数据】Winform“防界面卡死”
- C#利用反射技术实现winform界面动态存储
- WinForm多线程+委托防止界面卡死
- WinForm多线程+委托防止界面卡死
- VB.Net 解决winForm界面卡死
- winform异步线程防止界面卡死
- WinForm多线程+委托防止界面卡死
- C#中/winform中,给已经绑定数据的datagridview后台动态添加新行
- C# WinForm利用sideBar动态加载菜单栏,并创建菜单栏事件
- C# winform程序防止前台卡死
- C# winform button动态加载背景图
- 利用dll来动态加载不同界面
- 利用js将ajax获取到的后台数据动态加载至网页中
- winform防止界面卡死的三种方法
- c# winform treeview 递归加载数据库数据
- 最大化,最小化的区别
- 再回首UML之上篇
- IOS开发-给UIImageView赋无限循环动画
- 苹果iOS开发中如何直接跳转到App Store里面?
- popen——C程序中获取Shell命令的输出
- 【C#利用后台动态加载数据】Winform“防界面卡死”
- mybatis 使用 parameterType="Map" 传入值后 数据库中得到的却是 NULL
- 磊科无线路由器怎么设置密码【图文教程
- STM32 NVIC简化理解
- HTML表格边框的设置小技巧
- IOS开发-自适应高度的UITextView的实现
- virtualbox on archlinux host
- 前台技术--web页面通过JS显示当前日期
- 在Java内部类中使用外部类的成员方法以及成员变量