李超

cc编程笔记本。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
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";
            }

        }

posted on 2007-12-27 23:16  coderlee  阅读(1551)  评论(1编辑  收藏  举报