zoukankan      html  css  js  c++  java
  • 使用BackGroundWork处理大批量数据并用进度条显示进度

     

       微软提供的backgroundWorker是个非常好的用于异步操作的组件。下面就简单说明一下使用该组件实现异步处理大批量数据并用进度条显示处理进度的功能,并提供取消功能。通过在主窗体点击按钮弹出进度条模式窗体,提示用户数据处理进度。效果图如下:

      

    调用代码:

           private void button1_Click(object sender, EventArgs e)

            {

                this.backgroundWorker1.RunWorkerAsync();//运行backgroundWorker组件

              

     //显示进度条窗体

                ProcessForm form = new ProcessForm(this.backgroundWorker1);

                form.ShowDialog(this);

                form.Close();

          }

     

    DoWork事件:在此事件中处理大批量数据
     
    RunWorkerCompleted事件:无论是程序正常完成还是用户点击取消按钮,都会触发该事件
       private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                
    if (e.Error != null)
                {
                    MessageBox.Show(e.Error.Message);
                }
                
    else if (e.Cancelled)
                {
                }
                
    else
                {
                }
            }
    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
            {
                BackgroundWorker worker 
    = sender as BackgroundWorker;

                
    for (int i = 0; i < 100; i++)
                {
                    
    this.dtAll = DBOperator.GetDataTable("");//查询数据
                    worker.ReportProgress(i);
                    
    if (worker.CancellationPending) //如果用户取消则跳出处理数据代码
                    {
                        e.Cancel 
    = true;
                        
    break;
                    }
                }
          }

     

     

     

    ProcessForm窗体事件(进度条窗体)

      private BackgroundWorker backgroundWorker1;

            public ProcessForm(BackgroundWorker backgroundWorker1)

            {

                InitializeComponent();

                this.backgroundWorker1 = backgroundWorker1;

                this.backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);

                this.backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);

               

            }

     

            void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)

            {

                this.Close();

            }

     

            void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)

            {

                this.progressBar1.Value = e.ProgressPercentage;

            }       

     

            private void cancelButton1_Click(object sender, EventArgs e)

            {

                this.backgroundWorker1.CancelAsync();

                this.cancelButton1.Enabled = false;

                this.Close();

            }

     

    完整源码请进入群下载

  • 相关阅读:
    关于sqlserver2008 bcp根据数据表导出xml格式文件的小记
    关于SQL SERVER 2008 X64版本报错:消息 7302,级别 16,无法创建链接服务器 "(null)" 的 OLE DB 访问接口 "Microsoft.ACE.OLEDB.12.0" 的实例。
    Response.Redirect(),Server.Transfer(),Server.Execute()的区别[转]
    ASP.net应用程序中如何调用客户端的Javascript脚本小结(转)
    重写ListView控件,实现点击列头排序的功能
    关于Response.redirect和Response.End出现线程中止异常的处理(转)
    持续集成cruisecontrol.net学习总结
    [转]关于PowerDesigner反向工程SQL Server2000数据库时生成注释的解决方法
    敏捷开发scrum学习笔记一
    asp.net缓存机制总结(转)
  • 原文地址:https://www.cnblogs.com/gossip/p/1617167.html
Copyright © 2011-2022 走看看