• winform---BackgroundWorker


    (转自:http://www.cnblogs.com/coderlee/archive/2007/12/27/1017620.html)

    BackgroudWorker是.Net的Winform开发中处理可能会阻塞界面的耗时操作的标准做法,这种做法也许不是效率最高的(你可以使用BeginInvoke与EndInvoke并在EndInvoke获取结果然后根据结果修改界面显示,当然是询问InvokeRequired方式,也可以Thread.Start并在函数中根据结果以control.Invoke方式修改界面显示,但是这些不是最优雅的代码实现)

    BackgroundWorker提供了DoWork事件,可以把耗时操作绑定到该事件,事件响应函数的第二个参数DoWorkEventArgs有Argument属性和Result属性,可以向该事件传递以及返回的值。

    BackgroundWorker提供了无参和有一个object参数的重载方法RunWorkerAsync,调用Object参数的重载方法即可在DoWork事件响应函数的e.Argument属性来获取传递的参数。

    BackgroundWorker提供了ProgressChanged事件,可以通过订阅该事件来获取耗时操作所完成的进度,并显示在用户界面上,e.ProgressPercentage.

    BackgroundWorker提供了ReportProgress方法,可以在DoWork方法中调用该方法来触发ProgressChanged事件,并且传递进度参数给ProgressChanged事件的e.ProgressPercentage.

    BackgroundWorker提供了RunWorkerCompleted事件,当DoWork事件响应函数结束后该事件被触发,并且可以通过事件参数的e.result得到DoWork中设置的e.result。

    最主要的是RunWorkerCompleted,PrograssChanged两个事件都是在主调线程执行的(调用RunWorkerAsync方法的线程)。


    BackgroundWorker是一个不错的事件使用事例,不过实际开发中考虑到代码灵活性也可以使用底层的实现方法比如Thread.Start方法,BeginInvoke EndInvoke方法,等等。 

    下面是BackgroundWorker的一个简单示例

     private BackgroundWorker bwConnectDatabase; //连接数据库后台线程
    
            public frmMain()
            {
                InitializeComponent();
    
                bwConnectDatabase = new BackgroundWorker();
                bwConnectDatabase.DoWork += new DoWorkEventHandler(bwConnectDatabase_DoWork);
                bwConnectDatabase.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bwConnectDatabase_RunWorkerCompleted);
    
            }
            private void frmMain_Load(object sender, EventArgs e)
            {
                bwConnectDatabase.RunWorkerAsync();
            }
    
            /// <summary>
            /// 连接数据库方法
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            void bwConnectDatabase_DoWork(object sender, DoWorkEventArgs e)
            {
                BackgroundWorker bw = (BackgroundWorker)sender;
    
                bool blnConnected = false;
    
                try
                {
                    gConnByRead.Open();
                    if (gConnByRead.State == ConnectionState.Open)
                    {
                        blnConnected = true;
                    }
                    else
                    {
                        blnConnected = false;
                    }
                }
                catch
                {
                    blnConnected = false;
                }
    
                e.Result = blnConnected;
            }
    
            /// <summary>
            /// 连接数据库完毕
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            void bwConnectDatabase_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                bool blnConnected = (bool)e.Result;
    
                if (blnConnected)
                {
                    sb.Text = "DB: Connected";
    
                    gbController.Enabled = true;
                }
                else
                {
                    sb.Text = "DB: Disconnected";
                }
            }
    View Code
  • 相关阅读:
    密码朋克的社会实验(一):开灯看暗网
    ThinkPHP5框架缺陷导致远程命令执行(POC整合帖)
    SQL基本注入演示
    从SQL注入到内网漫游
    业务逻辑漏洞探索之敏感信息泄露
    Web安全之XSS Platform搭建及使用实践
    iOS URL Schemes与漏洞的碰撞组合
    phpcms2008远程代码执行漏洞
    使用RSA加密在Python中逆向shell
    源码级调试的XNU内核
  • 原文地址:https://www.cnblogs.com/FindSelf/p/3585997.html
Copyright © 2020-2023  润新知