赞
踩
C#上位机后台数据更新与前端UI数据更新界面不卡滞方法:多线程 & 委托
//comment:界面内需要加载backgroundWorker1控件(位于:工具->组件 内) //创建委托用于线程内更新UI控件数据 delegate void delegate_updateUI(ListViewItem listViewItem); //与委托配套的更新UI控件数据的方法 private void updateUI(ListViewItem listViewItem) { listView1.Items.Add(listViewItem); } //按钮启动线程 private void button1_Click(object sender, EventArgs e) { this.backgroundWorker1.RunWorkerAsync();//调用RunWorkerAsync()方法,会触发DoWork事件 } //耗时的工作在下面事件中进行:后台默默处理大量数据的地方(关于界面控件的东西,这里不要出现,比如给控件赋值,这里不要出现) private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { backgroundWorker1.WorkerReportsProgress = true; while (true) { int i = 0; for (; i <= progressBar1.Maximum; i++) { if (backgroundWorker1.CancellationPending) backgroundWorker1.ReportProgress(i, string.Format("{0}%,操作被中断", i));//要结合goto语句到while(true)前同时true替换为!backgroundWorker1.CancellationPending才能生效 backgroundWorker1.ReportProgress(i, String.Format("{0}%", i)); System.Threading.Thread.Sleep(1);//Sleep时间不限 但必须要有,否则程序会完全卡滞在while里运行 ListViewItem listViewItem = new ListViewItem(); listViewItem.Text = i + ""; listViewItem.SubItems.Add("A"); listViewItem.SubItems.Add("B"); this.BeginInvoke(new delegate_updateUI(updateUI), listViewItem);//线程内调用委托去更新UI数据 //若后台线程在更新UI界面且不需要等待,则使用BeginInvoke方法进行异步操作(调用之后立即返回,不会等待修改控件代码执行完,不会阻塞) //若后台线程在更新UI界面并且需要等待,则使用Invoke方法进行同步操作(会等待代码运行完之后返回,线程会阻塞) } } } //耗时线程内的backgroundWorker1.ReportProgress(i)有数据更新时执行的操作(此函数可以更新界面参数) private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { progressBar1.Value=e.ProgressPercentage; label1.Text=e.UserState.ToString(); }
效果图如下
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。