异步更新UI的几种方法
①.使用Control.Invoke方式来更新数据        
            foreach (DataGridViewRow dgvr in this.dgv_selected.Rows)
            {
                Application.DoEvents();
                this.progressBar1.Invoke(new MethodInvoker(delegate { this.progressBar1.Maximum = this.dgv_selected.Rows.Count; }));

//this.progressBar1.Invoke(new MethodInvoker(delegate { this.label12.Text = "正在保存:" + dgvr.Cells["Column3"].Value.ToString(); }));
                this.label12.Invoke(new MethodInvoker(delegate { this.label12.Text = "操作进度:" + dgvr.Cells["Column3"].Value.ToString(); }));
                this.label12.Refresh();

this.progressBar1.Invoke(new MethodInvoker(delegate { this.progressBar1.Value++; }));
             }

②.使用委托来更新:
        private delegate void IncreaseProgressBarValue(string username);
        private void updateProgerssBar(string username)
        {
            if (this.progressBar1.InvokeRequired)
            {
                IncreaseProgressBarValue inc = new IncreaseProgressBarValue(updateProgerssBar);
                this.progressBar1.Invoke(inc,new object[]{username});
            }
            else
            {
                this.progressBar1.Value++;
                this.label12.Text = "查询员工:" + username;
                this.label12.Refresh();
            }
        }
使用下面的方式调用委托:
        ThreadStart ts = delegate { updateProgerssBar(dgvr.Cells["EmpName"].Value.ToString()); };
        new Thread(ts).Start();

③.在.net framework4.0中使用TaskScheduler来实时更新UI
        private void AsyncWork()
        {
            // This scheduler will execute tasks
            // on the current SynchronizationContext
            // That is, it will access UI controls safely
            var uis = TaskScheduler.FromCurrentSynchronizationContext();
            for (int i = 0; i < 100; i++)
            {
                Application.DoEvents();
                Task.Factory.StartNew(() =>
                {
                    updateProgressBar();
                }, new CancellationToken(), TaskCreationOptions.None, uis);
            }  
        }
        private void updateProgressBar()
        {
            this.progressBar1.Value++;
            Thread.Sleep(100);
        }

最新文章

  1. 本地部署arcgis by eclipse
  2. Wpf之Xaml属性值和特性值(一)
  3. 【转】 linux 下Time_wait过多问题解决
  4. 第26天 swift reflect
  5. c# 调用 ShellExecute
  6. uglifyjs压缩JS
  7. LeetCode_Reverse Integer
  8. 【转】java中byte, int的转换, byte String转换
  9. Python 爬取美女图片,分目录多级存储
  10. arm_linux_device_mem内存映射
  11. Linux实战案例(6)yum查找、卸载、和安装软件
  12. Python条件判断 if-else for循环 while循环 break continue
  13. 201621123002《JAVA程序设计》第十四周学习总结
  14. (四)JavaScript 语句
  15. maven详细配置
  16. 深入理解java虚拟机---java虚拟机的发展史(四)
  17. windows远程访问ubuntu下的jupyter notebook必要配置
  18. log4j的配置详解(转)
  19. Centos下用yum命令按照jdk
  20. Java序列化接口Serializable接口的作用总结

热门文章

  1. Mac安装composer安装Yii2项目
  2. TypeError: &#39;dict&#39; object is not callabled
  3. Html Input disabled属性
  4. Hexo Next 调优
  5. win2003系统同步Linux ntp server批处理
  6. [转载]-win7启动本地MongoDB的四种方式
  7. python 异步IO-aiohttp与简单的异步HTTP客户端/服务器
  8. ArcGIS api for javascript——鼠标悬停时显示信息窗口
  9. BZOJ 2242 [SDOI2011]计算器 BSGS+高速幂+EXGCD
  10. Android开发之Volley网络通信框架