zoukankan      html  css  js  c++  java
  • 后台运行之BackgroundWorker

    BackgroundWorker 类允许您在单独的专用线程上运行操作。 耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态。 如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 BackgroundWorker 类方便地解决问题。

    一、BackgroundWorker 相关生命周期

       1.声明BackgroundWorker  

       2.设置相关操作事件和属性,并开始这个对象

       3.执行设置事件(DoWork事件为耗时操作,耗时操作时反馈给UI界面的ProgressChanged事件(Dowork的报告方法引发),

          完成DoWork时执行RunWorkerCompleted方法)

       4.写相关事件

    比如导出excel

    1.点击时事件

           /// <summary>
            /// 将数据库数据转换为excel操作
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void DbToExcel(object sender, RoutedEventArgs e)
            {
    
                BackgroundWorker bw = new BackgroundWorker();   //创建一个BackgroundWorker线程
                bw.WorkerReportsProgress = true;                //设置BackgroundWorker可以进行报告更新
                bw.DoWork += new DoWorkEventHandler(toExcel);  //执行耗时操作 创建一个DoWork事件,并进行报告,指定bw_DoWork方法去做事
                bw.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged); //通过报告(数据),进行对UI操作
                bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted); //完成操作时响应事件
                PartPosition = null;
                bw.RunWorkerAsync("my url");//开始执行DoWork事件 并传递一个对象
            }
    View Code

    2.BackgroundWorker 需要执行的事件

           void toExcel(object sender, DoWorkEventArgs e)
            {
                BackgroundWorker bw = (BackgroundWorker)sender;
                string url = e.Argument.ToString();
             
    
                    DataTable tableData = ProductMananger.getAllPositionList();           
                    
    
                    #region 插入数据
                 
        
                   
                    foreach (DataRow row in tableData.Rows)
                    {
                        //没有取消后台操作
                        if (!bw.CancellationPending)
                        {
                           //报告  
                           bw.ReportProgress((int)((double)(rowIndex - 1) / RowCount * 100), i);
                        }
                    }
               
                 
                }
            }
    
            private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                //progressBar1.Value = e.ProgressPercentage;
                //label1.Text = e.UserState.ToString();  这个是一个对象
                this.progressText.Text = e.ProgressPercentage+"%";
                this.progressbar_Excel.Value = e.ProgressPercentage;
            }
            private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                MessageBox.Show("ok!");
            }
    View Code

    如果不这样可以如下:

    Dispatcher.Invoke(new Action(() =>
                {
                    this.progressText.Text = (int)(Value / Maximum * 100) + "%";
                    this.progressbar_Excel.Value = Value;
                }));

     参考

    http://www.cnblogs.com/zhouzangood/articles/3638117.html

  • 相关阅读:
    c++ stl algorithm: std::find, std::find_if
    mysql---多表关联
    使用hadoop命令rcc生成Record 一个简单的方法来实现自己的定义writable对象
    Nexon由Xsolla全球支付服务
    configure.ac:20: error: Autoconf version 2.65 or higher is required
    的无线通信网络的学习LTE的关键技术HARQ(20141217)
    JAVA 公众微信的开放源码项目管理合作伙伴招募的版本号
    【工具】JAVA 在单元读取文件并比较
    linux下如何编译python生成libpython2.5.so动态库
    将主机IDS OSSEC日志文件存入MYSQL的方法
  • 原文地址:https://www.cnblogs.com/lizhenlin/p/5890158.html
Copyright © 2011-2022 走看看